文字列は実行可能!!!
function example_func() {
echo 'example_func was called';
}
'example_func'();
// example_func was called
配列も実行可能!!!
class ExampleClass
{
public static function example()
{
echo 'ExampleClass::example was called';
}
}
['ExampleClass', 'example']();
// ExampleClass::example was called
なにこれ!!!
どちらもコールバック / Callableでタイプヒンティングされた引数に渡せる形式。
callable
はis_callable
関数でtrue
と評価されるような、呼び出し可能な引数を定義する際に使います
function call_callback(callable $callback) {
$callback();
}
// callableでタイプヒンティングされた引数に渡せる形式は3つあります
function example_func() {
echo 'example_func was called';
}
class ExampleClass
{
public static function example1()
{
echo 'ExampleClass::example1 was called';
}
public function example2()
{
echo 'ExampleClass::example2 was called';
}
public function __invoke()
{
echo 'ExampleClass was called';
}
}
// 1.文字列
// 関数名
call_callback('example_func');
// example_func was called
// 静的メソッド
call_callback('ExampleClass::example1');
// ExampleClass::example1 was called
// 2.配列
// メソッド
call_callback([new ExampleClass, 'example2']);
// ExampleClass::example2 was called
// 静的メソッド
call_callback(['ExampleClass', 'example2']);
// ExampleClass::example1 was called
// 3.__invokeマジックメソッドを実装したオブジェクト
// オブジェクト
call_callback(new ExampleClass);
// ExampleClass was called
// 無名関数
call_callback(function () {
echo 'closure was called';
});
// closure was called
うーん
callable引数に渡すとき以外使い場所はない
ましてや文字列や配列を直接呼び出すことはないですね