ID: 13842 Updated by: jeroen Reported By: [EMAIL PROTECTED] 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] [EMAIL PROTECTED] Works fine for me with latest CVS. Please try the development build from http://www.php4win.com/ --Jani ------------------------------------------------------------------------ [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> ------------------------------------------------------------------------ Edit this 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]