国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

mylxsw / 1945人閱讀

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

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代碼優化— getter 和 setter

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

    hzc 評論0 收藏0
  • java | 什么是動態代理?

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

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

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

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

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

    light 評論0 收藏0

發表評論

0條評論

mylxsw

|高級講師

TA的文章

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