使用 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_PRIVATE
、 ReflectionProperty::IS_PROTECTED
和 ReflectionProperty::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 获取运行时属性的主要内容,如果未能解决你的问题,请参考以下文章