在当前版本的PHP中,这似乎不可行。
虽然ReflectionProperty::setAccessible()
确实采取一个布尔参数,它所做的更改只允许反射本身访问/不访问该值。它实际上并没有改变实际财产的可访问性。
作为一个哈克的解决办法,以保持动力性能的私人,考虑具有不实际存在于一个专门的专用阵列您__set
存储属性。示例代码:
class Test {
private $foo;
public $bar;
private $_properties;
public function __get($prop) {
if(property_exists($this, $prop))
return $this->$prop;
if(array_key_exists($prop, $this->_properties))
return $this->_properties[$prop];
}
public function __set($prop, $value) {
if(!property_exists($this, $prop)) {
$this->_properties[$prop] = $value;
echo 'SetDynamic: ', $prop, "\n";
return;
}
$this->$prop = $value;
echo 'Set: ', $prop, "\n";
}
}
从PHP交互提示运行:
php > $t = new Test;
php > $t->foo = 1;
Set: foo
php > $t->foo = 2;
Set: foo
php > $t->bar = 1;
php > $t->testorama = 1;
SetDynamic: testorama
php > $t->testorama = 2;
SetDynamic: testorama
虽然这将确保外部访问总是经过您的__get
和__set
方法,它为内部问题使用,因为你现在总是有两个地方检查动态属性。这就是为什么这是一个骇人的解决方法,而不是一个真正的解决方案。
简短的回答,没有。长的答案,你可能能够使用反射来改变属性的范围..但反射不应该像那样使用,除非你正在调试或单元测试。 –
你到底想干什么? –
@FabienWarniez刚刚为这个问题增加了真实的信息。 –