2011-07-24 13 views
3

PHPで変数ベースのオブジェクト演算子を設定しようとしていますが、探しているものを限定的にしか達成できません。たとえば、次のコードでは、変数選択が可能になります:オブジェクト演算子内の変数

$var1 = 'available_from'; 
$keyValuePairs[$key] = $item->parent()->{$var1}; 

をしかし、私も親セレクタ変数を作りたい場合は、私はもはやにできるように思えません。次の方法の両方が失敗:

$var1 = 'parent()->available_from'; 
$keyValuePairs[$key] = $item->{$var1}; 

$var1 = 'parent()'; 
$var2 = 'available_from'; 
$keyValuePairs[$key] = $item->{$var1}->{$var2}; 

そこで質問これを行う方法があるかどうかです。

+1

あなたの最後のスニペットから: '$ keyValuePairs [$キー] = $アイテム - > {$ VAR1}() - > {$ var2で} ; 'はうまくいくはずです。あなたは文字列のかっこを取り除こうとしましたか? –

+0

実際に表示されるエラーメッセージは何ですか?あなたはもう少し "失敗"を詳しく説明できますか?何が失敗するのですか、何を期待しましたか?どの部分があなたが望むものではありませんか? – hakre

答えて

13

あなたは基本的にそれを行うことができますが、外側に括弧を入れなければなりません。

$var1 = 'parent'; 
$var2 = 'available_from'; 
$keyValuePairs[$key] = $item->{$var1}()->{$var2}; 
// or $keyValuePairs[$key] = $item->$var1()->{$var2}; 

そして、基本的にはevalを使用せずに、その周りを取得する方法はありません。

// escape the first $ 
$keyValuePairs[$key] = eval("\$item->$var1->$var2"); 

しかし、あなたが最初の変数の潜在的なセットへのアクセスを持っている場合はevalを使用する理由は本当にありません。

あなたはそれを回避するために、このような何かを行うことができます。

function call_or_return($obj, $prop) 
{ 
    // test to see if it is a method (you'll need to remove the parens first) 
    $arr = array($obj, $prop); 
    // if so call it. 
    if(is_callable($arr)) return call_user_func($arr); 
    // otherwise return it as a property 
    return $obj->$prop; 
} 

call_or_return($item, $var1)->{$var2}; 
+0

非常に参考に - ありがとうございます。 –