使用 ReflectionClass 获取运行时属性

Posted

技术标签:

【中文标题】使用 ReflectionClass 获取运行时属性【英文标题】:Getting runtime properties with ReflectionClass 【发布时间】:2015-08-16 09:17:51 【问题描述】:

所以我正在探索反射类的使用。我注意到了几件事。 必须先设置我的属性的可访问性,然后才能在 Origin 类中使用 Even 属性的值或名称。

我想知道的是可以通过ReflectionClass 在运行时设置属性。例如

class MyClass

    public $bathroom = 'Dirty';
    protected $individual = 'President';
    private $conversation = '****************';

    function outputReflectedPublic()
    
        $reflection = new ReflectionClass($this);
        $props = $reflection->getProperties(ReflectionProperty::IS_PUBLIC);
        foreach($props as $prop)
            echo $prop->getName() . ' : ' . $prop->getValue($this);
    


$obj = new MyClass();
$obj->outputReflectedPublic();//bathroom : Dirty
//now we add a new property
$obj->$ect = 'ify';
$obj->outputReflectedPublic();//bathroom : Dirty  //same as before

现在我对此并不感到惊讶。 我试图使用 ReflectionProperty::IS_PRIVATEReflectionProperty::IS_PROTECTEDReflectionProperty::IS_STATIC 来查看该属性是否作为受保护/私有/静态存在于实例中

我还使用了$prop->setAccessible(true) 来防止出现无法访问的错误。 我无法看到 $ect 属性。

我能够通过这样的内部函数获得$ect 属性:

function getAll()

    foreach($this as $key=>$val)
        echo $key . ' : ' . $val . '<br>';

浴室:脏

个人:总裁

转化:****************

ect : 确认

有没有办法从 ReflectionClass 的对象中获取 ($ect) 类型的属性?这些属性的正式名称是什么?

【问题讨论】:

ReflectionClass 明确反映了;你想要的是反射对象实例,ReflectionObject 是正确的反射器。 【参考方案1】:

ReflectionClass::getProperties() 仅获取由类显式定义的属性。要反映您在对象上设置的所有属性,包括动态属性,请使用从 ReflectionClass 继承并适用于运行时实例的 ReflectionObject:

$reflect = new ReflectionObject($this);

【讨论】:

哦,太好了,这仍然允许IS_PUBLIC 过滤器等吗?动态属性是运行时集属性的正式名称吗? 由于它派生自 ReflectionClass,它支持您可以与该类一起使用的所有接口,包括带有过滤器的 getProperties。 您知道使用ReflectionObject 超过ReflectionClass 是否会影响性能?在对象可能有也可能没有额外属性的情况下

以上是关于使用 ReflectionClass 获取运行时属性的主要内容,如果未能解决你的问题,请参考以下文章

PHP反射(ReflectionClassReflectionMethod)

PHP 反射

NFS 常见报错

反射API

对动态创建的对象的依赖注入

制作反射类传递类型提示