它似乎不起作用:
$ref = new ReflectionObject($obj);
if($ref->hasProperty('privateProperty')){
print_r($ref->getProperty('privateProperty'));
}
它进入IF循环,然后抛出错误:
属性privateProperty不存在
:|
$ref = new ReflectionProperty($obj, 'privateProperty')
也不起作用......
documentation page列出了一些常量,包括IS_PRIVATE
。如果我无法访问私有财产,我该如何使用?
答案 0 :(得分:35)
class A
{
private $b = 'c';
}
$obj = new A();
$r = new ReflectionObject($obj);
$p = $r->getProperty('b');
$p->setAccessible(true); // <--- you set the property to public before you read the value
var_dump($p->getValue($obj));
答案 1 :(得分:1)
如果您需要它无反射:
public function propertyReader(): Closure
{
return function &($object, $property) {
$value = &Closure::bind(function &() use ($property) {
return $this->$property;
}, $object, $object)->__invoke();
return $value;
};
}
然后像这样使用它(在同一个类中):
$object = new SomeObject();
$reader = $this->propertyReader();
$result = &$reader($object, 'some_property');
答案 2 :(得分:0)
getProperty
抛出异常,而不是错误。重要的是,您可以处理它,并为自己保存if
:
$ref = new ReflectionObject($obj);
$propName = "myProperty";
try {
$prop = $ref->getProperty($propName);
} catch (ReflectionException $ex) {
echo "property $propName does not exist";
//or echo the exception message: echo $ex->getMessage();
}
要获取所有私有媒体资源,请使用$ref->getProperties(IS_PRIVATE);
答案 3 :(得分:0)
请注意,如果您需要获取来自父类的私有财产的价值,则接受的答案将不起作用。
为此,您可以依靠 getParentClass method of Reflection API。
此外,这已经在 this micro-library 中解决了。
在 this blog post 中有更多详细信息。