ID:               37212
 Updated by:       [EMAIL PROTECTED]
 Reported By:      andreasblixt at msn dot com
 Status:           Assigned
 Bug Type:         Class/Object related
 Operating System: *
 PHP Version:      5.1.4
 Assigned To:      helly
 New Comment:

The problem is that right now struct property_info does not know where
the property was declared. Thus what the engine sees is B accessing
some protected property in C. The fix seems however quite easy. I'll
give it a try.


Previous Comments:
------------------------------------------------------------------------

[2006-05-05 19:03:33] [EMAIL PROTECTED]

Probably a missing check if the property was declared in a common
parent class?

------------------------------------------------------------------------

[2006-04-27 19:39:38] crescentfreshpot at yahoo dot com

Odd. Here is a complete example.
<?php

class A {
    protected $value;
    public function __construct($val) {
        $this->value = $val;
    }
    public function copyValue($obj) {
        $this->value = $obj->value;
    }
    protected function getValue() {
        return $this->value;
    }
}

class B extends A {
    public function copyValue($obj) {
        $this->value = $obj->getValue(); // this works
        $this->value = $obj->value; // this is fatal
    }
}
class C extends A {}

$B = new B("Value from B");
$C = new C("Value from C");
$B->copyValue($C);

?>

Strange that the method call works but the property access doesn't.
Both are protected.

------------------------------------------------------------------------

[2006-04-27 15:41:26] andreasblixt at msn dot com

The property is not being redeclared in C, though. It is still a
property of A, structure-wise. A method declared and called in the same
way as the property does not cause any error. Here's a simple non-code
example:

protected method() is declared in A.
protected $property is declared in A.
B and C both extend A.
Method in B tries to access $C->property [FATAL ERROR]
Method in B tries to access $C->method() [No error]

One could even make method() return $this->property which would not
cause an error either. It would be expected that both the property and
method would have the same visibility when declared in the same class.

------------------------------------------------------------------------

[2006-04-27 15:02:13] crescentfreshpot at yahoo dot com

Here is simplified reproduce code:

<?php

class A {
    protected $value;

    public function __construct($val) {
        $this->value = $val;
    }

    public function copyValue($obj) {
        $this->value = $obj->value;
    }
}

class B extends A {
    public function copyValue($obj) {
        $this->value = $obj->value;
    }
}
class C extends A {}

$B = new B("Value from B");
$C = new C("Value from C");

$B->copyValue($C); // fatal

var_dump($B);

?>

I'm not sure that this is a bug. Class B's copyValue() is trying to
access a protected member of Class C, which is not in B's chain of
inheritance.

------------------------------------------------------------------------

[2006-04-26 18:37:27] andreasblixt at msn dot com

While looking for a workaround I found that the result of the test on a
protected method instead of a protected property is different
(successful):

Workaround:
-----------
Add a protected method in the same class in which the protected
property is defined that returns the value of the property. Then call
the method in place of attempting to access the property.

------------------------------------------------------------------------

The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
    http://bugs.php.net/37212

-- 
Edit this bug report at http://bugs.php.net/?id=37212&edit=1

Reply via email to