php - 如何在 PHP 中使用反射通过引用获取属性值?

标签 php reflection

假设你有一个这样声明的类:

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/

相关文章:

java - 如何使用 Java Reflection 设置不同数字类型的数字字段

php - PHP中\x00,\x04是什么意思

java - java 允许我将这个对象分配给这个通用字段吗?

php - Google Play 抓取工具

php - 学说 : Set CURRENT_TIMESTAMP as default value by the database (i. e.不是通过 PHP)

c# - 获取枚举的自定义属性的属性

go - 用反射设置零指针的地址

Java:Java 是否在幕后将方法参数转换为数组?

php - 如何处理 IPv6 地址和 IPv4 PHP

php - 调试 MySQL