関数の渡し方

今まですごい勘違いしてた。

<?php
function doSomething($func) {
  $func();
}

// 渡されるコールバック関数
function callback() { echo "hello\n"; }

// ずっとこうやってた
doSomething(callback);

// 本当はこうしなくちゃいけないらしい
doSomething('callback');
?>

今までこれで動いてた理由は、

  • 一つ目のdoSomethingの呼び出しでは、引数が自動的に'callback'に変換される
  • 文字列オブジェクトに対して関数呼出しの演算子()を使うと、文字列が関数名と判断される

の連係プレーのおかげなんだな。前者に関しては、error_reporting(E_ALL)の下で実行してみれば確かにnoticeが出た(http://ideone.com/LfGd3 )。後者に関しては次のようなこともできる。http://ideone.com/4oD4x

<?php
function foo () { echo "foo"; }
$fun = "foo";
$fun();
?>

文字列オブジェクトと関数オブジェクトがごちゃ混ぜになってる感じで気持ちがわるいので、

<?php
function foo () { echo "foo"; }
$fun = function () { foo(); };
$fun();
?>

って書きたい気もする。