2012-04-18 2 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

を助け

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メソッドを書くことができます:

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

私はそれをお勧めしませんが、あなたはevalを使用することができますクロージャを使用することについて

$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でのみ可能です。

または、より一般的なバージョン、このようなものとして:

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

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

また、これは私が推測動作するはずです子供の財産。これは動作します:あなたは `エコー$ bの意味でした