2012-04-18 4 views
0

변수 변수를 사용하여 무언가를하려하고 있는데 객체 문제에 봉착했습니다. 이 클래스 설정을 상상해 : 변수 변수 + 필드의 객체

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

어떤 가능성이 내가이 일?

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

주 같은이 만들 수 있습니다 :

class A 
{ 
    public $field = 10; 
} 

class B 
{ 
    public $a; 

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

이제 모든 사람이이 코드 파이스 동전 작동하는지 알고 : eval 함수를 사용하지 않는 옵션?

+1

을하는 데 도움이

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; 

희망 -> $ var'를? – Travesty3

+0

예 나는 그것을했고 지금은 고쳐야한다. – Santhos

+0

사실, 그렇다고 생각하지 않는다. – Leven

답변

1

당신은에 액세스 할 수 클래스에서 사용자 정의 __get 방법을 쓸 수 있습니다 childrens 속성. 이 작품 : 당신은`에코 $ B를 의미 않았다

0

나는 그것을 권장하지 않습니다,하지만 당신은 평가를 사용할 수 있습니다

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

이것은 작동 할 것이지만 ... 당신은 스스로 말했다. – Santhos

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;