2021年12月5日

PHP 魔術方法|三分鐘看懂 __invoke 用法

本篇為 PHP 系列

__invoke() 是 PHP 眾多魔術方法中的一個,可以用來讓你將物件作為 function 使用,詳細說明可參考官方說明文件

問題是,把物件當作 function 使用是什麼意思呢?其實就是在物件後面直接加(),如果還是不清楚,我們接著看以下的範例就知道囉。

範例

我們簡單來實作一個類別,這個類別是一個乘法器,負責運算乘法。

我們把乘數 $multiple 作為建構子的參數傳入,並在 __invoke() 中使用。

class Multiplier
{
  private $multiple;
    
  public function __construct($multiple)
  {
    $this->multiple = $multiple;
  }

  public function __invoke($number)
  {
    return $this->multiple * $number;
  }
}

要如何利用 __invoke 呢?只要創建出該類別的物件,並把該物件當作 function 來使用就好了,也就是加上括號()

下面,我們有兩個簡單範例,在第一個範例《兩倍乘法器》中,我們傳入參數 2 ,創建了一個 Multiplier 物件,並且將這個物件指派給 $double 變數。

接著下一行,我們對變數進行 function call,將 4 作為參數傳入,而這樣的行為就會觸發 __invoke 中的程式,因此會進行 2 * 4 = 8的運算。《三倍乘法器》也是同樣的邏輯。

兩倍乘法器:

$double = new Multiplier(2);
echo $double(4); // 8

三倍乘法器:

$triple = new Multiplier(3);
echo $triple(4); // 12

如果沒有 __invoke

如果沒有實作 __invoke 而直接把物件作為 function 使用,會出現錯誤。

class Multiplier
{
  private $multiple;
  
  public function __construct($multiple)
  {
    $this->multiple = $multiple;
  }
}

$double = new Multiplier(2);
echo $double(4);

錯誤訊息:

PHP Fatal error:  Uncaught Error: Object of type Multiplier is not callable 

經由這樣的錯誤訊息提示,也可以知道實作 __invoke 後的類別,其物件就會是一種 callable

參考

PHP invoke: is anybody using it?

本篇為 PHP 系列