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の補完も効くので、タイプミスに強く読みやすくなります。

類似投稿

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です