成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

PHP|基于攔截器的委托方法的實踐

mylxsw / 1955人閱讀

摘要:提供了內(nèi)置的攔截器方法,它可以攔截發(fā)送到未定義方法和屬性的消息。委托是指一個對象轉發(fā)或者委托一個請求給另一個對象,被委托的一方幫忙處理請求。更進一步如果在攔截器里使用方法會更好

PHP提供了內(nèi)置的攔截器方法,它可以攔截發(fā)送到未定義方法和屬性的消息。也被稱為重載(overloading)。

攔截器方法

    __get($property) // 訪問未定義的屬性時被調(diào)用
    __set($property, $value) // 給未定義的屬性賦值時被調(diào)用
    __isset($property) // 給未定義的屬性調(diào)用isset()時被調(diào)用
    __unset($property) // 給未定義的屬性調(diào)用unset()時被調(diào)用
    __call($method, $arg_array) //調(diào)用未定義的方法時被調(diào)用

PHP經(jīng)常使用靜態(tài)術語的表達方式(即::符號)來討論類方法與屬性,即使改方法和屬性并非靜態(tài)。當提及Person::$name屬性時,要注意name屬性不一定是靜態(tài)屬性,很可能需要通過對象來訪問。

當創(chuàng)建Person對象并嘗試設置一個名為Person::$name的屬性時,因為這個類沒有定義$name屬性,所以__set()方法被調(diào)用。

__call方法對于實現(xiàn)委托也很有用。委托是指一個對象轉發(fā)或者委托一個請求給另一個對象,被委托的一方幫忙處理請求。

舉個例子

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;
    }
}

調(diào)用

$person = new Person(new PersonWriter());
$person->writeName();

此處提供了一個動態(tài)的接口,來讓Person對接PersonWriter,也是提供一種思路。

更進一步

如果在攔截器里使用call_user_func()方法會更好

function __call($method, $args) {
    if (method_exists($this->obj, $method)) {
        return call_user_func_array([$this->obk, $method], $args);
    }
}

文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://systransis.cn/yun/21654.html

相關文章

  • PHP代碼優(yōu)化— getter 和 setter

    摘要:同時也可以用來實現(xiàn)委托,委托是指一個對象轉發(fā)一個請求給另一個對象,把請求的處理委托給另一個對象。但在繼承是父類與子類的關系是固定的,而使用委托可以在運行時改變使用的對象,委托比繼承具有更大的靈活性。 PHP中要實現(xiàn)類似于Java中的getter和setter有多種方法,比較常用的有: 直接箭頭->調(diào)用屬性(最常用),不管有沒有聲明這個屬性,都可以使用,但會報Notice級別的錯誤 $d...

    hzc 評論0 收藏0
  • java | 什么是動態(tài)代理?

    摘要:代理模式在我們?nèi)粘V泻艹R?,生活處處有代理看張學友的演唱會很難搶票,可以找黃牛排隊買嫌出去吃飯麻煩,可以叫外賣無論是黃牛外賣騎手都得幫我們干活。靜態(tài)代理我還是以找黃牛幫我排隊買張學友的演唱會門票的例子,寫個說明。 微信公眾號:一個優(yōu)秀的廢人。如有問題,請后臺留言,反正我也不會聽。 最近在復習 Java 相關,回顧了下代理模式。代理模式在 Java 領域很多地方都有應用,它分為靜態(tài)代理和...

    fxp 評論0 收藏0
  • 探索兩種優(yōu)雅表單驗證——策略設計模式和ES6Proxy代理模式

    原文收錄在我的 GitHub博客 (https://github.com/jawil/blog) ,喜歡的可以關注最新動態(tài),大家一起多交流學習,共同進步,以學習者的身份寫博客,記錄點滴。 在一個Web項目中,注冊,登錄,修改用戶信息,下訂單等功能的實現(xiàn)都離不開提交表單。這篇文章就闡述了如何編寫相對看著舒服的表單驗證代碼。 假設我們正在編寫一個注冊的頁面,在點擊注冊按鈕之前,有如下幾條校驗邏輯。 ...

    Bamboy 評論0 收藏0
  • 探索兩種優(yōu)雅表單驗證——策略設計模式和ES6Proxy代理模式

    原文收錄在我的 GitHub博客 (https://github.com/jawil/blog) ,喜歡的可以關注最新動態(tài),大家一起多交流學習,共同進步,以學習者的身份寫博客,記錄點滴。 在一個Web項目中,注冊,登錄,修改用戶信息,下訂單等功能的實現(xiàn)都離不開提交表單。這篇文章就闡述了如何編寫相對看著舒服的表單驗證代碼。 假設我們正在編寫一個注冊的頁面,在點擊注冊按鈕之前,有如下幾條校驗邏輯。 ...

    light 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<