|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2014-08-12 14:33 UTC] leuffen at continue dot de
Description:
------------
At present ReflectionProperty::setAccessible() works only one-way: Changing unaccessible Properties to accessible. setAccessible(false) will have no affect. This is complicated for frameworks using __get() and __set():
Our frameworks use the magic __get() and __set() methods to validate data or to load Entities from Database.
To take advantage from common IDE's code-completion we declare these properties public and unset them whithin the constructor (and store the actual data whithin a private or protected property).
It would be a great advantage for working with these Objects if we could use the ReflectionProperty::setAccessible() Method to change property visibility to private and enforce use of __get() and __set() methods.
Test script:
---------------
class Entity {
public $name = "direct access";
public function __construct() {
$ref = new ReflectionObject($this);
foreach ($ref->getProperties() as $prop) {
$prop->setAccessible(FALSE);
}
}
public function __get($name) {
return "access over __get()";
}
}
$o = new Entity();
echo $o->name;
Expected result:
----------------
"access over __get()"
Actual result:
--------------
"direct access"
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Sat Dec 13 03:00:02 2025 UTC |
I don't see why this should be a bad thing to do. (Maybe defining properties in DocBlock @property is a much better way than unsetting them. But that's not the point) The point is that although if we would, we have to store the actual data in an data-structure that differs from the IDEs point of view. So debugging etc. is much more complicated than it could be. --testscript- /** * Class Entity * * @property string $name */ class Entity { public function __construct() { } public function __set($name, $val) { echo "setting $name "; $this->$name = $val; $ref = new ReflectionObject($this); $ref->getProperty($name)->setAccessible(FALSE); } public function __get($name) { echo "getting $name"; } } $entity = new Entity(); $entity->name = "value"; echo $entity->name; --/testscript- Above example will call __get() once - and afterwards access the property direcly. If you have an better approach - please write me.