風柳メモ

ソフトウェア・プログラミング関連の覚書が中心

【覚書】PHPの戻り値を変数を介さずにアクセスする

PHP 5.3.3 の場合

function foo() {
    return array(1,2,3);
}
$a = foo();
echo $a[1]; // 2

のように、一旦関数の戻り値を変数に格納してからアクセスしないといけなくて、

echo foo()[1]; // PHP Parse error:  syntax error, unexpected '[', expecting ',' or ';' in php shell code on line 1

だと、エラーになってしまう。
メモ:PHP 5.4.0だと大丈夫らしい。

なんとか方法はないかと探していると……。

stdClass を利用してアクセスする方法があった

PHP-users - [PHP-users 35690] 関数の戻り値を変数に格納せずに配列アクセスしたいにて、

function foo(){ 
   $ret = new stdClass; 
   $ret->data = array(1,2); 
   return $ret; 
} 

var_dump( foo()->data ); 
PHP-users - [PHP-users 35690] 関数の戻り値を変数に格納せずに配列アクセスしたい

という書き方が可能なことを発見。

ということで、

// === Result Wrapper
function    &rw(&$r) {
    $obj = new stdClass;
    $obj->r = &$r;
    return $obj;
}

という関数を用意しておけば、例えば、

例えばこういうことができたら楽だと思いませんか?
(そして php 5.4.0 ではそれができるので気に入りました)

$path = '/abc/def/ghi.xyz';
foo( pathinfo($path)['basename'] );

PHP-users - [PHP-users 35690] 関数の戻り値を変数に格納せずに配列アクセスしたい

についても、

  $path = '/abc/def/ghi.xyz'; 
  var_dump( &rw(pathinfo($path))->r['basename'] ); // string(7) "ghi.xyz"

のように書ける。
小技として、覚えておく価値はありそう。