在例項中呼叫 Invoke 型別的類

心智極客發表於2019-12-18

PHP 的 __invoke 是一個很有用的特性,可以保持類的單一職責

示例

class Invokable
{
    public function __invoke()
    {
        echo '已被 invoke';
    }
}

使用

$invokable = new Invokable();
$invokable();

Invokeable 類可以被注入到其他類中

class Foo
{
    protected $invokable;

    public function __construct(Invokable $invokable)
    {
       $this->invokable = $invokable;
    }

    public function callInvokable()
    {
        $this->invokable();
    }
}

使用 $this->invokable(); 來啟用 Invokable 類,類會去尋找名為 invokable 的方法,因此下面操作將會報錯

$foo = new Foo($invokable);
$foo->callInvokable();
// Call to undefined method Foo::invokable() 

以下是正確的呼叫方法

public function callInvokable()
{
    // 優先推薦
    call_user_func($this->invokable);

    // 可選
    $this->invokable->__invoke();

    // 可選
    ($this->invokable)();
}

點選 連結,免費加入心智極客的知識星球分享群,共同成長。

相關文章