摘要:提供了內置的攔截器方法,它可以攔截發送到未定義方法和屬性的消息。委托是指一個對象轉發或者委托一個請求給另一個對象,被委托的一方幫忙處理請求。更進一步如果在攔截器里使用方法會更好
PHP提供了內置的攔截器方法,它可以攔截發送到未定義方法和屬性的消息。也被稱為重載(overloading)。
攔截器方法
__get($property) // 訪問未定義的屬性時被調用 __set($property, $value) // 給未定義的屬性賦值時被調用 __isset($property) // 給未定義的屬性調用isset()時被調用 __unset($property) // 給未定義的屬性調用unset()時被調用 __call($method, $arg_array) //調用未定義的方法時被調用
PHP經常使用靜態術語的表達方式(即::符號)來討論類方法與屬性,即使改方法和屬性并非靜態。當提及Person::$name屬性時,要注意name屬性不一定是靜態屬性,很可能需要通過對象來訪問。
當創建Person對象并嘗試設置一個名為Person::$name的屬性時,因為這個類沒有定義$name屬性,所以__set()方法被調用。
__call方法對于實現委托也很有用。委托是指一個對象轉發或者委托一個請求給另一個對象,被委托的一方幫忙處理請求。
舉個例子
class PersonWriter { public function writeName(Person $p) { print $p->getName() . PHP_EOL; } public function writeAge(Person $p) { print $p->getAge() . PHP_EOL; } } class Person { private $writer; public function __construct(PersonWriter $writer) { $this->writer = $writer; } public function __call($methodname, $args) { if (method_exists($this->writer, $methodname)) { return $this->writer->methodname($this); } } public function getName() { return "Bob"; } public function getAge() { return 44; } }
調用
$person = new Person(new PersonWriter()); $person->writeName();
此處提供了一個動態的接口,來讓Person對接PersonWriter,也是提供一種思路。
更進一步如果在攔截器里使用call_user_func()方法會更好
function __call($method, $args) { if (method_exists($this->obj, $method)) { return call_user_func_array([$this->obk, $method], $args); } }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/21654.html
摘要:同時也可以用來實現委托,委托是指一個對象轉發一個請求給另一個對象,把請求的處理委托給另一個對象。但在繼承是父類與子類的關系是固定的,而使用委托可以在運行時改變使用的對象,委托比繼承具有更大的靈活性。 PHP中要實現類似于Java中的getter和setter有多種方法,比較常用的有: 直接箭頭->調用屬性(最常用),不管有沒有聲明這個屬性,都可以使用,但會報Notice級別的錯誤 $d...
摘要:代理模式在我們日常中很常見,生活處處有代理看張學友的演唱會很難搶票,可以找黃牛排隊買嫌出去吃飯麻煩,可以叫外賣無論是黃牛外賣騎手都得幫我們干活。靜態代理我還是以找黃牛幫我排隊買張學友的演唱會門票的例子,寫個說明。 微信公眾號:一個優秀的廢人。如有問題,請后臺留言,反正我也不會聽。 最近在復習 Java 相關,回顧了下代理模式。代理模式在 Java 領域很多地方都有應用,它分為靜態代理和...
原文收錄在我的 GitHub博客 (https://github.com/jawil/blog) ,喜歡的可以關注最新動態,大家一起多交流學習,共同進步,以學習者的身份寫博客,記錄點滴。 在一個Web項目中,注冊,登錄,修改用戶信息,下訂單等功能的實現都離不開提交表單。這篇文章就闡述了如何編寫相對看著舒服的表單驗證代碼。 假設我們正在編寫一個注冊的頁面,在點擊注冊按鈕之前,有如下幾條校驗邏輯。 ...
原文收錄在我的 GitHub博客 (https://github.com/jawil/blog) ,喜歡的可以關注最新動態,大家一起多交流學習,共同進步,以學習者的身份寫博客,記錄點滴。 在一個Web項目中,注冊,登錄,修改用戶信息,下訂單等功能的實現都離不開提交表單。這篇文章就闡述了如何編寫相對看著舒服的表單驗證代碼。 假設我們正在編寫一個注冊的頁面,在點擊注冊按鈕之前,有如下幾條校驗邏輯。 ...
閱讀 1399·2021-09-02 09:53
閱讀 2667·2021-07-29 13:50
閱讀 1715·2019-08-30 11:07
閱讀 1571·2019-08-30 11:00
閱讀 1450·2019-08-29 14:00
閱讀 1844·2019-08-29 12:52
閱讀 2560·2019-08-29 11:11
閱讀 3415·2019-08-26 12:23