本篇為PHP系列
前言
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 | 魔術方法 | 認識__get及__set,並看看Laravel如何使用它們
看更多PHP系列文章:PHP系列