PHP5.3で無名関数を使う
PHP5.3の無名関数でちょっとハマったのでメモ。
どうやら無名関数(だけじゃなくて普通の関数もだと思うけど。)はPHPの実行前のフェーズで検証がされる模様。
ちゃんと動く。
<?php $a = array(1,2,3,4,5); $b = array_map(function($item){return $item * 10;},$a); print_r($b); /* Array ( [0] => 10 [1] => 20 [2] => 30 [3] => 40 [4] => 50 ) */
これがうまく動かない。
- $bがarrayじゃないと言われてる。これって、無名関数の初期化がPHP実行時の一番最初のほうのフェーズで行われているということなんだろうか。
<?php $a = array(1,2,3,4,5); $b = array(); array_map(function($item){array_push($b, $item * 10);},$a); print_r($b); /* [23-Aug-2012 05:01:33 UTC] PHP Warning: array_push() expects parameter 1 to be array, null given in /home/aaa/array.php on line 5 */
これはもちろん大丈夫だった。
<?php $a = array(1,2,3,4,5); $b = array(); foreach($a as $item){ array_push($b, $item * 10); } print_r($b); /* Array ( [0] => 10 [1] => 20 [2] => 30 [3] => 40 [4] => 50 ) */
というか、PHPは関数を実行前に検証しますよっていうだけの話だったのかも。