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]

Reply via email to