From: [EMAIL PROTECTED]
Operating system: Windows NT 5.0 build 2195
PHP version: 4.0.6
PHP Bug Type: Class/Object related
Bug description: Member variables in parent and child classes overwrite each other
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 bug report at: http://bugs.php.net/?id=13842&edit=1
--
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
To contact the list administrators, e-mail: [EMAIL PROTECTED]