2012-04-18 52 views
0

我想用變量做一些事情,並且遇到了對象問題。想象一下,這個類設置:變量+字段中的對象

class A 
{ 
    public $field = 10; 
} 

class B 
{ 
    public $a; 

    public function __construct() 
    { 
    $this->a = new A(); 
    } 
} 

現在大家都知道,這PICE的代碼工作:

$a = new A(); 
$var = 'field'; 
echo $a->$var; // this will echo 10 

是否有可能,我可以做這樣的事情?:工作

$b = new B(); 
$var = 'a->field'; 
echo $b->$var; // this fails 

注:任何不使用eval函數的選項?

+1

您的意思是'回聲$ B - > $ var'? – Travesty3 2012-04-18 19:09:20

+0

是的,我做了,現在應該修復 – Santhos 2012-04-18 19:10:55

+0

是的,但我認爲這不會起作用。 – Leven 2012-04-18 19:11:12

回答

1

你可以在你的類來訪問編寫自定義__get方法兒童財產。這工作:

class A 
{ 
    public $field = 10; 
} 

class B 
{ 
    public $a; 

    public function __construct() 
    { 
    $this->a = new A(); 
    } 

    public function __get($property) { 
    $scope = $this; 

    foreach (explode('->', $property) as $child) { 
     if (isset($scope->$child)) { 
    $scope = $scope->$child; 
     } else { 
    throw new Exception('Property ' . $property . ' is not a property of this object'); 
     } 
    } 

    return $scope; 
    } 
} 

$b = new B(); 
$var = 'a->field'; 
echo $b->$var; 

希望幫助

0

我不建議這樣做,但你可以使用eval:

$b = new B(); 
$var = 'a->field'; 
eval('echo $b->$'.$var); 
+0

這將工作,但是...你自己說 – Santhos 2012-04-18 19:15:17

2

如何使用閉包?

$getAField = function($b) { 
    return $b->a->field; 
}; 

$b = new B(); 
echo $getAField($b); 

雖然只能在更新版本的PHP中使用。

,或作爲更寬泛的版本,像這樣:

function getInnerField($b, $path) { // $path is an array representing chain of member names 
    foreach($path as $v) 
     $b = $b->$v; 
    return $b; 
} 

$b = new B(); 
echo getInnerField($b, array("a", "field")); 
0

這也應該工作,我想:

$b = new B(); 
$var1 = 'a'; 
$var2 = 'field' 

echo ($b->$var1)->$var2;