2012-07-22 83 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

相關問題