Quantcast
Channel: 配列タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 813

PHPの文字列と配列は実行可能?!?!

$
0
0

文字列は実行可能!!!

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でタイプヒンティングされた引数に渡せる形式。

callableis_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引数に渡すとき以外使い場所はない
ましてや文字列や配列を直接呼び出すことはないですね


Viewing all articles
Browse latest Browse all 813

Trending Articles