2013年4月23日火曜日

phpで深いオブジェクトのメンバ変数を動的にアクセスする方法

phpでは変数に値を代入してオブジェクトのメンバ変数を動的アクセスすることが出来ます。

<?php
$foo->bar0 = "hoge0";
$foo->bar1 = "hoge1";
$foo->bar2 = "hoge2";
for($i=0;$i<3;$i++){
    $idx = "bar".$i;
    echo $foo->$idx."\n";
}
?>

これの結果は次のようになります。

$ php test.php
hoge0
hoge1
hoge2
$

しかし、オブジェクトが深くなるとこの方式ではアクセス出来なくなります。

<?php
$foo->bar->hoge0 = "moge0";
$foo->bar->hoge1 = "moge1";
$foo->bar->hoge2 = "moge2";
for($i=0;$i<3;$i++){
    $idx = "bar->hoge".$i;
    echo $foo->$idx."\n";
}
?>

これだとUndefined propertyと言われてしまい、アクセス出来ませんでした。

$ php test.php
PHP Notice:  Undefined property: stdClass::$bar->hoge0 in /Users/yanagimoto/public_html/test.php on line 8

Notice: Undefined property: stdClass::$bar->hoge0 in /Users/yanagimoto/public_html/test.php on line 8

PHP Notice:  Undefined property: stdClass::$bar->hoge1 in /Users/yanagimoto/public_html/test.php on line 8

Notice: Undefined property: stdClass::$bar->hoge1 in /Users/yanagimoto/public_html/test.php on line 8

PHP Notice:  Undefined property: stdClass::$bar->hoge2 in /Users/yanagimoto/public_html/test.php on line 8

Notice: Undefined property: stdClass::$bar->hoge2 in /Users/yanagimoto/public_html/test.php on line 8

$

あまり、良い方法ではありませんがeval関数を使うとアクセス出来ます。

<?php
$foo->bar->hoge0 = "moge0";
$foo->bar->hoge1 = "moge1";
$foo->bar->hoge2 = "moge2";
for($i=0;$i<3;$i++){
    $idx = '$foo->bar->hoge'.$i;
    echo eval("return {$idx};")."\n";
}
?>

結果は下記のようになりました。

$ php test.php
moge0
moge1
moge2
$

しかし、マニュアルにも書いてある通り、任意のPHPコードを実行できてしまう危険な関数なので用法はお間違えの無いように。

0 コメント:

コメントを投稿