使用ReflectionClass获取运行时属性

时间:2015-06-02 14:09:19

标签: php class object properties access-modifiers

所以我正在探索使用Reflection类。我注意到了一些事情。 必须先设置我的属性的可访问性,然后才能在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>';
}
  

浴室:脏了

     个人:总统

     

对话:****************

     

等:ify

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

1 个答案:

答案 0 :(得分:3)

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

$reflect = new ReflectionObject($this);