Hi,

Thanks for the reply. Still looks bad.

My mistake, but I left the script in it's "good" configuration. If you 
change the line:

class C2 extends C1_1

To:

class C2 extends C1

the the bad behaviour is shown. I left the line in the former state.

Doug



>From: Bug Database <[EMAIL PROTECTED]>
>To: [EMAIL PROTECTED]
>Subject: Bug #13842 Updated: Member variables in parent and child classes 
>overwrite each other
>Date: 27 Oct 2001 05:37:46 -0000
>
>ID: 13842
>Updated by: sniper
>Reported By: [EMAIL PROTECTED]
>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] [EMAIL PROTECTED]
>
>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>
>
>
>------------------------------------------------------------------------
>
>
>
>ATTENTION! Do NOT reply to this email!
>To reply, use the web interface found at 
>http://bugs.php.net/?id=13842&edit=2
>


_________________________________________________________________
Get your FREE download of MSN Explorer at http://explorer.msn.com/intl.asp


-- 
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]

Reply via email to