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

資訊專欄INFORMATION COLUMN

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

hzc / 522人閱讀

摘要:同時也可以用來實現(xiàn)委托,委托是指一個對象轉(zhuǎn)發(fā)一個請求給另一個對象,把請求的處理委托給另一個對象。但在繼承是父類與子類的關(guān)系是固定的,而使用委托可以在運行時改變使用的對象,委托比繼承具有更大的靈活性。

PHP中要實現(xiàn)類似于Java中的gettersetter有多種方法,比較常用的有:

直接箭頭->調(diào)用屬性(最常用),不管有沒有聲明這個屬性,都可以使用,但會報Notice級別的錯誤

$dog = new Dog();
$dog->name = "hey";

添加settergetter方法,類似于Java

class Dog 
{
    private $name = ‘’;
    public function setName($name) {
        $this->name = $name;
    }
    public function getName() {
        return $this->name;
    }
}

使用魔術(shù)方法(最裝x)

class Dog1
{
    private $_name = "";
    function __set($property, $value) {
        if ($property === "name") $this->_name = $value;
    }
    function __get($property) {
        if ($property === "name") return $this->_name;
    }
}

上面三種方法,大部分人能都想到的也就是前兩種方法,對于第三種方法PHP小白看了第一感覺就是好厲害(心中暗想這人一定是大佬),但是這樣寫真的能體現(xiàn)出編程水平嗎?

對這幾種方法,我們來對比下它們的執(zhí)行效率:

方法一代碼:?

方法二代碼:

方法三代碼:
?

主要就是兩個for循環(huán),外層循環(huán)10次,內(nèi)層一百萬次,總計循環(huán)了一千萬次,convert函數(shù)只是用來輸出可讀性更高的內(nèi)存使用情況?,F(xiàn)在在我本地測試一下,測試的機器時2015款的MBP,i5 16GB內(nèi)存,PHP7.2.13(cli)版本,執(zhí)行結(jié)果分別如下:

方法一:

方法二:?

方法三:?

會什么方法三會這么慢?有人可能會說可能因為魔術(shù)方法里面的if判斷,那我現(xiàn)在把if去掉試試:
?

執(zhí)行結(jié)果如下:?

發(fā)現(xiàn)if的影響很小,而且這種寫法也并不推薦,這里的魔術(shù)方法就相當(dāng)于一個攔截器,當(dāng)調(diào)用未定義的屬性時就會調(diào)用魔術(shù)方法,但這里只是測試,真實環(huán)境一定不能這么寫。

從結(jié)果可以看出,我們直接使用箭頭函數(shù)速度是最快的,最常用最簡單的方法執(zhí)行效率也是最高的,后面兩種方法不僅代碼行數(shù)多了一些,而且執(zhí)行效率不及第一種,特別是使用魔術(shù)方法,執(zhí)行效率是第一種的6倍左右,是第二種的2倍左右,古人常說“智者千慮必有一失,愚者千慮必有一得”大概就是這個意思吧,在這里代碼行數(shù)和執(zhí)行效率都增多了。

不過,對于第一種方法,可讀性就不是很高,不管屬性有沒有定義都能隨便調(diào)用,代碼并不規(guī)范,其他人在審查你的代碼時就不是很方便,建議屬性屬性使用前聲明下。

魔術(shù)方法還有哪些?

PHP中,__call()方法可能是最有用的魔術(shù)方法了,用它可以實現(xiàn)很tricky的東西。當(dāng)要調(diào)用類中未定義的方法時,__call()會被調(diào)用,第一個參數(shù)是調(diào)用未定義的方法名稱,第二個參數(shù)是傳遞給調(diào)用方法的所有參數(shù),是一個數(shù)組,__call()的返回值會返回給調(diào)用者,這樣就好像調(diào)用一個真實存在的方法一樣。

同時__call也可以用來實現(xiàn)委托委托是指一個對象轉(zhuǎn)發(fā)一個請求給另一個對象,把請求的處理委托給另一個對象。這就有點類似于繼承,和在子類中調(diào)用父類的方法有點相似。但在繼承是父類與子類的關(guān)系是固定的,而使用委托可以在運行時改變使用的對象,委托比繼承具有更大的靈活性。代碼如下:

代碼中Doctor類接收一個PersonWriter對象作為構(gòu)造函數(shù)的參數(shù),并將它存儲在$printer中,在__call()中檢查PersonWriter中是否存在$methodName方法,如果存在,就委托PersonWriter對象來處理,并將當(dāng)前類Doctor的實例傳給它,運行結(jié)果如下:

這樣我們就不用在Doctor中手動調(diào)用如下方法:

$this->printer->printMe($this);

如果此時給PersonWriter增加幾個新的方法,使用委托可以節(jié)省很多時間,但代碼也會變得不清晰,不易理解。對于調(diào)用者來說,你提供的是一個動態(tài)的接口,沒有辦法進行反射(reflection),因為調(diào)用的類與被委托的類之間的交互比較模糊,使用時需要提供說明文檔。

回到文章主題,我們對PHP的gettersetter相關(guān)使用進行了對比,以Java程序猿的思維看第二種方法中規(guī)中矩,沒有任何套路,第一種和第三種應(yīng)該是PHP才有的,但第三種方式執(zhí)行的效率遠不及前兩種,而第一種方式雖然效率最高,但使用時盡量還是把屬性聲明下,使代碼的結(jié)構(gòu)更清晰。

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

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/31107.html

相關(guān)文章

  • Java HotSpot VM中的JIT編譯

    摘要:如同其它虛擬機,虛擬機為字節(jié)碼提供了一個運行時環(huán)境。編譯是一個混合模式的虛擬機,也就是說它既可以解釋字節(jié)碼,又可以將代碼編譯為本地機器碼以更快的執(zhí)行。解決此問題一般是在進程啟動后,對代碼進行預(yù)熱以使它們被強制編譯。 Java HotSpot虛擬機是Oracle收購Sun時獲得的,JVM和開源的OpenJDK都是以此虛擬機為基礎(chǔ)發(fā)展的。如同其它虛擬機,HotSpot虛擬機為字節(jié)碼提供了一...

    caozhijian 評論0 收藏0
  • PHP設(shè)計模式(三):封裝

    摘要:原文地址設(shè)計模式三封裝面向?qū)ο缶幊讨?,一切都是對象,對一個對象的封裝,也成了面向?qū)ο缶幊讨斜夭豢缮俚牟糠帧7庋b方法和別的程序設(shè)計語言一樣,也只是三種封裝概念,,。直接訪問和修改破壞了類的封裝性。 原文地址:PHP設(shè)計模式(三):封裝 Introduction 面向?qū)ο缶幊讨?,一切都是對象,對一個對象的封裝,也成了面向?qū)ο缶幊讨斜夭豢缮俚牟糠?。和C/C++,Java,Python等語言一...

    dongxiawu 評論0 收藏0
  • PHP 性能分析與實驗(二)——PHP 性能的微觀分析

    摘要:性能分析與實驗性能的宏觀分析在上一篇文章中,我們從是解釋性語言動態(tài)語言和底層實現(xiàn)等三個方面,探討了性能的問題。在開始分析之前,我們得掌握一些與性能分析相關(guān)的函數(shù)。二性能分析則下面我們根據(jù)小程序來驗證一些常見的性能差別。 【編者按】此前,閱讀過了很多關(guān)于 PHP 性能分析的文章,不過寫的都是一條一條的規(guī)則,而且,這些規(guī)則并沒有上下文,也沒有明確的實驗來體現(xiàn)出這些規(guī)則的優(yōu)勢,同時討論的也側(cè)...

    Airy 評論0 收藏0
  • Yii2 框架核心概念之屬性(手冊翻譯)

    摘要:屬性在里,類的成員變量也被稱之為屬性,這些變量是類定義的一部分,被用來表示類實例的狀態(tài)區(qū)分不同類實例。不同之處在于,當(dāng)屬性被讀時,關(guān)聯(lián)的方法被調(diào)用,當(dāng)屬性被修改時,關(guān)聯(lián)的方法被調(diào)用。 屬性 在PHP里,類的成員變量也被稱之為屬性,這些變量是類定義的一部分,被用來表示類實例的狀態(tài)(區(qū)分不同類實例)。在具體的實踐中,你可能要經(jīng)常處理可讀或者可寫屬性的特殊方式,舉個例子, 你可能想要給屬性...

    awesome23 評論0 收藏0
  • 五年面試,三年模擬

    摘要:在盒模型中,設(shè)置的是的寬度高度,在怪異模式中設(shè)置的是寬度高度。狀態(tài)行,由協(xié)議版本號,狀態(tài)碼,狀態(tài)消息三部分組成。第四次揮手收到后,進入狀態(tài),接著發(fā)送一個給,確認序號為收到序號,進入狀態(tài),完成四次揮手。評論區(qū)可以糾錯完善,也可以留言面試題目 css部分 rem原理 rem布局的本質(zhì)是等比縮放,一般是基于寬度,假設(shè)將屏幕寬度分為100份,每份寬度是1rem,1rem的寬度是屏幕寬度/100,,...

    henry14 評論0 收藏0

發(fā)表評論

0條評論

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