Bug #13842 Updated: Member variables in parent and child classes overwrite each other
| From: | jeroen@php.net | Date: | Sun, 28 Oct 2001 15:52:56 +0000 |
| Subject: | Bug #13842 Updated: Member variables in parent and child classes overwrite each other | ||
| References: | 1 | Groups: | php.dev |
| Request: | Send a blank email to php-dev+get-69183@lists.php.net to get a copy of this message | ||
ID: 13842
Updated by: jeroen
Reported By: dfplant@hotmail.com
Old Status: Feedback
Status: Bogus
Bug Type: Class/Object related
Operating System: Windows NT 5.0 build 2195
PHP Version: 4.0.6
New Comment:
Alle class vars are public, in a future PHP (5?) there will also be private object vars.
Until then, object vars of children and parents are simply the same, and thus overwrite eachother.
This is intended behavior.
Not a bug.
Previous Comments:
------------------------------------------------------------------------
[2001-10-27 01:37:46] sniper@php.net
Works fine for me with latest CVS. Please try the
development build from http://www.php4win.com/
--Jani
------------------------------------------------------------------------
[2001-10-26 17:52:30] dfplant@hotmail.com
I'm not all that familiar with PHP, so it's possible I haven't understood something
that should be obvious, or have mistyped something. But assuming that's not the case:
To my eye this makes using someone else's classes via inheritence a wee bit dangerous, and
makes using inheritence at all somewhat problematic since changing a class that exists in an
inheritence makes one liable to create subtle bugs in code that one has not modified - which defeats
one of the (possibly the most) principal purposes of OO.
If I could make a suggestion: support of 'private' and 'public' for member
variables might be a good thing. Especially if access defaulted to 'private' and that
meant that the variable was only visible to the immediate class.
Using the CGI binary without modification running on "Microsoft-IIS/5.0" I used the
following test script:
<html>
<head>
<title>Inheritence Bug</title>
</head>
<body>
<?php
//=========================================================================
// NOTE:
// Bad behaviour if C2 extends C1, Correct if C2 extends C1_1
class C2 extends C1_1
{
var $m_sMe = "C2"; // ERROR: this overwrites parent
var $m_sIniter = "";
function C2( $sIniter="")
{
$this->m_sIniter = $sIniter; // OK - by defn
parent::C1( $this->m_sMe); // OK - the way to do it
}
function WhoIsIt()
{
printf( "C2::WhoIsIt() : This is: " . $this->m_sMe . "<br>\n");
printf( "Inited by: " . $this->m_sIniter . "<br>\n");
parent::WhoIsIt();
}
}
//=========================================================================
class C1_1
{
var $m_sMe_1 = "C1";
var $m_sIniter_1 = "";
function C1( $sIniter="")
{
print( "(OK)<br>\n");
$this->m_sIniter_1 = $sIniter;
}
function WhoIsIt()
{
printf( "C1::WhoIsIt() : This is: " . $this->m_sMe_1 . "<br>\n");
printf( "Inited by: " . $this->m_sIniter_1 . "<br>\n");
}
function ResetBase()
{
$this->m_sMe_1 = "C1";
printf( "C1::ResetBase() : This is: " . $this->m_sMe_1 . "<br>\n");
printf( "Inited by: " . $this->m_sIniter_1 . "<br>\n");
}
}
//=========================================================================
class C1
{
var $m_sMe = "C1";
var $m_sIniter = "";
function C1( $sIniter="")
{
print( "(Bad)<br>\n");
$this->m_sIniter = $sIniter; // ERROR: this overwrites child's value
}
function WhoIsIt()
{
printf( "C1::WhoIsIt() : This is: " . $this->m_sMe . "<br>\n");
printf( "Inited by: " . $this->m_sIniter . "<br>\n");
}
function ResetBase()
{
$this->m_sMe = "C1";
printf( "C1::ResetBase() : This is: " . $this->m_sMe . "<br>\n");
printf( "Inited by: " . $this->m_sIniter . "<br>\n");
}
}
//=========================================================================
$test = new C2( "Doug");
$test->WhoIsIt();
//$test->ResetBase();
?>
<p>
In case there is a platform dependency, this is what I consider correct output:<br>
<pre>
C2::WhoIsIt() : This is: C2
Inited by: Doug
C1::WhoIsIt() : This is: C1
Inited by: C2
</pre>
</p>
</body>
</html>
------------------------------------------------------------------------
Edit this bug report at http://bugs.php.net/?id=13842&edit=1