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]

Reply via email to