From:             [EMAIL PROTECTED]
Operating system: Windows NT 5.0 build 2195
PHP version:      4.0.6
PHP Bug Type:     Class/Object related
Bug description:  Member variables in parent and child classes overwrite each other

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