#44930 [Opn->Bgs]: protected __set()|__get() not working

From: Date: Wed, 07 May 2008 15:08:18 +0000
Subject: #44930 [Opn->Bgs]: protected __set()|__get() not working
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-124800@lists.php.net to get a copy of this message
ID: 44930 Updated by: jani@php.net Reported By: daniel at txtconnect dot com -Status: Open +Status: Bogus Bug Type: Class/Object related Operating System: Linux (Ubuntu 7.10) PHP Version: 5.2.6 New Comment: 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 Previous Comments: ------------------------------------------------------------------------ [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/?id=44930&edit=1

« previous php.bugs (#124800) next »