Edit report at http://bugs.php.net/bug.php?id=44930&edit=1
ID: 44930 Comment by: theodor at tonum dot no Reported by: daniel at txtconnect dot com Summary: protected __set()|__get() not working Status: Bogus Type: Bug Package: Class/Object related Operating System: Linux (Ubuntu 7.10) PHP Version: 5.2.6 Block user comment: N Private report: N New Comment: I'd give kudos to daniel for this one. Yes, __get() and __set() is supposed to be set to public - but it would be a good thing, in terms of data-encapsulation, that we could have protected __get() and __set(). Dunno if this should be brought to feature request - but as the documentation states: "All overloading methods must be defined as public. " One should expect another result than the above by defining __get/__set as protected (e.g. a php error). Previous Comments: ------------------------------------------------------------------------ [2008-05-07 15:08:18] j...@php.net Thank you for taking the time to write to us, but this is not a bug. Please double-check the documentation available at http://www.php.net/manual/ and the instructions on how to report a bug at http://bugs.php.net/how-to-report.php ------------------------------------------------------------------------ [2008-05-07 03:40:52] crrodriguez at suse dot de http://php.net/manual/en/language.oop5.overloading.php "All overloading methods must be defined as public. " but anyway.. your code is behaving as expected. ------------------------------------------------------------------------ [2008-05-07 00:02:14] daniel at txtconnect dot com Description: ------------ When using protected __set() it still gets called from outside the class (parent or children) Reproduce code: --------------- abstract class Example { private $data = array(); protected function __set($key, $value) { $this->data[$key] = $value; } protected function __get($key) { return $this->data[$key]; } } class MyExample extends Example { public function __construct($name, $value) { $this->$name = $value; // sets parent::$data[$name] = $key } } $c = new MyExample('name', 'foo'); echo $c->name; // echoes foo (Should not do so because Example::__get() is protected) $c->name = 'bar'; // Should not be able to assign 'bar' Example::__set() protected, but does! echo $c->name; // echoes bar (Should not do so because Example::__get() are protected) var_dump($c); Expected result: ---------------- I expected an error to be thrown saying that i am trying to access protected data and am not allowed to do so. When setting a variable, from outside the class, i should be unable to do so error thrown! Actual result: -------------- foo bar object(MyExample)#1 (1) { ["data:private"]=> array(1) { ["name"]=> string(3) "bar" } } ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/bug.php?id=44930&edit=1