2018年12月15日

認識PHP魔術方法: __call

Introduce to php magic method: __call

本篇為PHP系列

下一篇:認識PHP魔術方法: __call(應用篇)


前言

PHP 提供了一些懶人方法,這些懶人方法在特殊的情況下會自動觸發,可以省去開發人員自己攥寫程式的麻煩,相當方便。而這些懶人方法就是所謂的 Magic Method,也就是魔術方法。

本篇將會介紹其中一種魔術方法:__call。

一般情況

在一般情況下,若程式執行過程中呼叫到不存在的或者是非 public 的方法時,PHP 會報錯。以提醒開發人員不能使用使方法。

例如:

1. 執行不存在的方法時,PHP會報錯

class TodoList
{
}

$todoList = new TodoList();
$todoList->add('to reserve a restaurant');

Output:

PHP Fatal error:  Uncaught Error: Call to undefined method TodoList::add()

2. 執行非public的方法時,PHP會報錯

class TodoList
{
  private function add($newTodo)
  {
    //do something...
  }
}

$todoList = new TodoList();
$todoList->add('to reserve a restaurant');

Output:

PHP Fatal error:  Uncaught Error: Call to private method TodoList::add()

__call

在這種情況下,就是 __call 出場的時機,嚴格來說,__call() 被觸發的時機是:

當程式所呼叫的方法是類別外部無法使用(not accessible)的方法時。
所謂無法使用的方法包含:該方法不存在、或者是該方法並非 public。

實作__call

若類別中有實作 __call() 方法時,遇到沒辦法呼叫的方法的話,__call 就會被觸發。


實作方式很簡單,在類別中直接加入一個名為__call的公開類別方法即可。
public function __call($method, $arguments)
{
 //
}

其中第一個參數 $method 代表外界原本意圖呼叫的方法名稱, 第二個參數 $arguments 則是原本所傳入的參數, 所有內容會被存放在名為 $arguments 的陣列中。

以下為簡單的實例:

1. 執行到不存在的方法,觸發 __call()

class TodoList
{
  public function __call($name, $arguments)
  {
    echo "hey! method: {$name} is not exist!\n";
  }
}

$todoList = new TodoList();
$todoList->add('to reserve a restaurant');

Output:

hey! method: add is not exist!

2. 執行到非 public 的方法,觸發 __call()

class TodoList
{
  public function __call($name, $arguments)
  {
    echo "hey! method {$name} is not accessible to you!\n";
  }

  private function add()
  {
    //do something
  }
}

$todoList = new TodoList();
$todoList->add('to reserve a restaurant');

Output:

hey! method add is not accessible to you!

本篇程式碼執行環境

OS: Mac OS Mojave 10.14.2

PHP: PHP 7.3.0


下一篇:認識PHP魔術方法: __call(應用篇)

延伸:PHP | 魔術方法 | 認識__get及__set,並看看Laravel如何使用它們

看更多PHP系列文章:PHP系列