Bug #13842 Updated: Member variables in parent and child classes overwrite each other
| From: | sniper@php.net | Date: | Sat, 27 Oct 2001 05:37:46 +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-69112@lists.php.net to get a copy of this message | ||
ID: 13842
Updated by: sniper
Reported By: dfplant@hotmail.com
Old Status: Open
Status: Feedback
Bug Type: Class/Object related
Operating System: Windows NT 5.0 build 2195
PHP Version: 4.0.6
New Comment:
Works fine for me with latest CVS. Please try the
development build from http://www.php4win.com/
--Jani
Previous Comments:
------------------------------------------------------------------------
[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