2012-07-22 93 views
9

这似乎并没有工作:我可以通过Reflection获得私人房产的价值吗?

$ref = new ReflectionObject($obj); 

if($ref->hasProperty('privateProperty')){ 
    print_r($ref->getProperty('privateProperty')); 
} 

它进入了IF循环,然后抛出一个错误:

Property privateProperty does not exist

:|

$ref = new ReflectionProperty($obj, 'privateProperty')也不管用...

documentation page列出了几种常量,包括IS_PRIVATE。如果我无法访问私有财产,我该如何使用它?

+0

为什么你需要吗? – zerkms 2012-07-22 23:55:09

+1

的IS_PRIVATE和行吟诗人常数适用于的GetProperties(复数 - 不是的getProperty)方法 – 2012-07-22 23:57:29

回答

26
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)); 
+0

您的例子似乎工作,但我不:(难道是因为我的课是一个子类 – Alex 2012-07-22 23:58:36

+0

@Alex:看?它们之间的区别肯定有东西,你已经错过了 – zerkms 2012-07-22 23:59:02

+0

@Alex:。是的,'private'只看到他们在创建类,但在这种情况下'hasProperty'将返回'FALSE' – zerkms 2012-07-22 23:59:59

1

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);

+0

头的了,'IS_PRIVATE'应是'ReflectionProperty :: IS_PRIVATE' – 2018-01-24 23:03:56

相关问题