假设你有一个这样声明的类:
class DummyObject{
public $attr;
public function __construct(){
$this->attr=array('val_1','val_2','val_3');
}
}
这样做:
$obj=(new DummyObject1());
$attr=&$obj->attr;
您将获得对 $attr
的引用,因此对数组进行的任何修改也将在 DummyObject $obj 实例中进行。
现在,问题终于来了。使用反射,¿如何获得对存储在 $attr
中的数组的引用而不是副本?我试过这个没有成功:
$obj=(new DummyObject());
$reflector = new ReflectionObject($obj);
$reflectorProperty = $reflector->getProperty('attr');
$propertyValue=$reflectorProperty->getValue($ref);
其实$attr
是原始数组的一个拷贝。
提前致谢!
最佳答案
从 PHP 5.4 开始,您无需反射即可做到这一点:
class Kitchen
{
private $yummy = 'cake';
}
$reader = function & ($object, $property) {
$value = & Closure::bind(function & () use ($property) {
return $this->$property;
}, $object, $object)->__invoke();
return $value;
};
$kitchen = new Kitchen();
$cake = & $reader($kitchen, 'yummy');
$cake = 'sorry, I ate it!';
var_dump($kitchen);
这要归功于 PHP 5.4 在运行时切换闭包范围的能力。
您可以在 http://3v4l.org/sZMt1 找到一个运行示例
我实际上在 http://ocramius.github.io/blog/accessing-private-php-class-members-without-reflection/ 上详细解释了该技术和最终用例。
关于php - 如何在 PHP 中使用反射通过引用获取属性值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7345648/