first-class callable記法(…)で関数を値として渡す
first-class callable記法(...)はPHP 8.1の書き方で、関数やメソッドを呼び出さずにClosureとして取り出せます。文字列や配列でのコールバック指定より安全で、IDEの補完も効きます。
PHP 8.1で入ったfirst-class callable記法、地味ですがコールバックの受け渡しが読みやすくなります。関数やメソッドを「呼ぶ」のではなく「値として取り出す」ための書き方です。
従来の文字列・配列指定
これまでコールバックは文字列や配列で渡していました。
$fn = 'strlen'; // 関数名を文字列で
$fn = [$obj, 'method']; // メソッドを配列で
$fn = ['ClassName', 'staticFn']; // 静的メソッド
これはタイプミスしても実行時までエラーにならず、IDEの補完も効きませんでした。
新記法
$fn = strlen(...); // 関数
$fn = $obj->method(...); // メソッド
$fn = ClassName::staticFn(...); // 静的メソッド
$lengths = array_map(strlen(...), $words);
末尾に(...)を付けると「今は呼ばずにClosureとして取り出す」という意味になります。存在しない関数名ならその場でエラーになりますし、補完も効きます。
まとめ
コールバックを渡す場面では、文字列指定より(...)記法のほうが安全で読みやすいです。中身は普通のClosureになるので、変数に入れて使い回すこともできます。array_mapやusortの引数を書くときに思い出すと、コードが一段すっきりします。
よくある質問
Q. (…)記法で取り出したものは何になりますか。
A. 普通のClosureになります。変数に入れて使い回したり、array_mapなどに渡したりできます。
Q. 文字列でのコールバック指定と比べて何がいいのですか。
A. 存在しない関数名ならその場でエラーになり、IDEの補完も効くので、タイプミスに強く読みやすくなります。