コールバック関数とは?
コールバック関数とは、「別の関数に引数として渡され、あとで呼び出される関数」のことです。
主に、配列操作やイベント駆動の処理などでよく使われます。
コールバックの基本的な使い方
-
通常の関数名を文字列で渡す方法
<?php // コールバック関数として使う関数 function sayHello($name) { return "Hello, $name!"; } // 配列と array_map を使ってコールバックを適用 $greetings = array_map("sayHello", ["Taro", "Hanako", "Jiro"]); print_r($greetings);
-
無名関数(クロージャ)を使う方法
<?php $names = ["Taro", "Hanako", "Jiro"]; // 無名関数をコールバックとして渡す $greetings = array_map(function($n) { return "Hello, $name!"; }, $names); print_r($greetings); ?>
-
First-class Callable Syntaxを使う方法(php8.1以上)
// コールバック関数として使う関数 function sayHello($name) { return "Hello, $name!"; } // 配列と array_map を使ってコールバックを適用 $greetings = array_map(sayHello(...), ["Taro", "Hanako", "Jiro"]); print_r($greetings);
結果
Array
(
[0] => Hello, Taro!
[1] => Hello, Hanako!
[2] => Hello, Jiro!
)
お判りいただけただろうか?(ホラー風)
一度だけの使い捨てのような関数はクロージャで良いと思いますが、複数の箇所で利用する場合は通常関数の方が使いやすいです。
さて、本題です。
私は、phpの通常のコールバックは非常に分かりにくいと思っています。
だってこうですよ?
function hi($name) {
echo "Hi, $name";
}
$hi = 'hi'; // ここでは文字列 or 関数名
$hi('Taro'); // ここで初めてコールバック変数と分かる
分かっていればどうということはないんですが、関数名なのか文字列なのかの区別が使用する方法を見るまで分からないのです。
つまり、認知負荷が高いという事になると思います。
First-class Callable Syntaxの場合では、そういう問題はありません。
強いて言えば、新しい文法なので...ってなんや?!って事ですね。
$hi = hi(...); // ここでhiのコールバック変数と分かる
$hi('Taro');
と言う事で、表記方法が増えているので分かりやすいものを使ってみては如何でしょうか。
おまけ
何でこの話になったかと言うと、最近wordpressを触る事になりましたが、フックの登録がこれなんですよ?
ぱっと見、2つの文字列渡しているようにしか見えないですよね?(熟達の人だと関数名にしかみえないのかですが)
function xxx_post_list() { ... }
add_shortcode('shortcode_post_list', 'xxx_post_list');
function xxx_post_list() { ... }
add_shortcode('shortcode_post_list', xxx_post_list(...));
私は、後者の方が分かりやすいです。
クラス関数の場合も同じように書けます。
class CustomPost {
public static function save_post(int $post_id, WP_Post $post, bool $update): void {}
}
add_action('save_post', CustomPost::save_post(...), 10, 3);