php有個magic method叫__call(),寫法是這樣的:
__call的兩個參數可以任意取名,只要確定是兩個就好。
當呼叫的target不存在,class Demo就會轉為呼叫__call(),讓開發者可以去設定如果function呼叫不到的時候做的事情,以上面的code執行下來,結果會是:
當沒有建立__call()的時候,會出現報錯:
Fatal error: Call to undefined method Demo::target() in /Users/Hong/php/test/test.php on line 11
這裡有個今天讀code剛學到的小技巧:
假設今天不確定動物的叫聲,這裡只需要呼叫動物的種類當作function name,然後因為Animal class找不到該function name,所以會呼叫__call(),__call()拿到之後就可以根據該function name去做對應的動作。
注意到了嗎?本來應該是找不到function name做的預防措施,這邊卻反過來利用了這個特性,故意讓class找不到該function name,然後做統一分發。
所以如果運用到API的溝通部分就是,先看看$_SERVER['REQUEST_METHOD']進來的是什麼,GET,POST,PUT?接著再從__call()統一分發到對應的function去呼叫後端API,達到整合的作用。
寫code真的是一門永遠無法精通的學問,就算把單一語言的特性跟用法用得滾瓜爛熟,但永遠都會有更出其不意,或是更聰明的方式去完成任務,這次的__call()反其道而行的用法著實讓我大開了眼界。
參考資料:
http://php.net/manual/en/language.oop5.overloading.php#object.call
class Demo { public function __call($function , $args) { echo 'function: *' . $function . '* don\'t exist!'; } } (new Demo)->target();
__call的兩個參數可以任意取名,只要確定是兩個就好。
當呼叫的target不存在,class Demo就會轉為呼叫__call(),讓開發者可以去設定如果function呼叫不到的時候做的事情,以上面的code執行下來,結果會是:
function: *target* don't exist!
當沒有建立__call()的時候,會出現報錯:
Fatal error: Call to undefined method Demo::target() in /Users/Hong/php/test/test.php on line 11
這裡有個今天讀code剛學到的小技巧:
class Animal { public function __call($function , $args) { if ($function == 'dog') { $this->bark(); } elseif ($function == 'cat') { $this->meow(); } } private function bark() { echo 'bark!'; } private function meow() { echo 'meow!'; } } (new Animal)->dog();
假設今天不確定動物的叫聲,這裡只需要呼叫動物的種類當作function name,然後因為Animal class找不到該function name,所以會呼叫__call(),__call()拿到之後就可以根據該function name去做對應的動作。
注意到了嗎?本來應該是找不到function name做的預防措施,這邊卻反過來利用了這個特性,故意讓class找不到該function name,然後做統一分發。
所以如果運用到API的溝通部分就是,先看看$_SERVER['REQUEST_METHOD']進來的是什麼,GET,POST,PUT?接著再從__call()統一分發到對應的function去呼叫後端API,達到整合的作用。
寫code真的是一門永遠無法精通的學問,就算把單一語言的特性跟用法用得滾瓜爛熟,但永遠都會有更出其不意,或是更聰明的方式去完成任務,這次的__call()反其道而行的用法著實讓我大開了眼界。
參考資料:
http://php.net/manual/en/language.oop5.overloading.php#object.call
沒有留言:
張貼留言