|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
[2001-10-27 01:37 UTC] sniper@php.net
[2001-10-28 10:52 UTC] jeroen@php.net
|
|||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Wed Nov 05 05:00:01 2025 UTC |
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>