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