工場長のブログ

日々思ったことを書いてます。

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は関数を実行前に検証しますよっていうだけの話だったのかも。