PHP這種寫法有什麼優點?

來源:互聯網
上載者:User
關鍵字 php
經常看到一些第三方庫有這樣的寫法
舉個栗子

protected $outType = 'html';public function setType($type){    $this->outType = $type;}

那麼我在代碼中調用的時候,如果要輸出json格式的資料的話就必須先調一次setType這個方法

$this->setType('json');.........$this->display(); //這個display裡判斷$outType屬性是`html`還是`json`

我不解的是,為什麼不在display()方法裡直接傳遞一次參數呢,比如下面這樣

$this->display('json');

這樣還省了一次方法調用。 我想知道第一種的寫法的好處主要表現在什麼地方

謝謝大家了。

回複內容:

經常看到一些第三方庫有這樣的寫法
舉個栗子

protected $outType = 'html';public function setType($type){    $this->outType = $type;}

那麼我在代碼中調用的時候,如果要輸出json格式的資料的話就必須先調一次setType這個方法

$this->setType('json');.........$this->display(); //這個display裡判斷$outType屬性是`html`還是`json`

我不解的是,為什麼不在display()方法裡直接傳遞一次參數呢,比如下面這樣

$this->display('json');

這樣還省了一次方法調用。 我想知道第一種的寫法的好處主要表現在什麼地方

謝謝大家了。

第一種寫法:你可以把它理解為:

function demo($type = 'html'){    return $type;}

只不過現在整體變成類了!因為本類在外面被繼承調用時,有可能會根據調用方的不同比如:需要輸出html或者json格式,但是我又不能直接修改protected $outType的值,那必然要有一種辦法去間接修改該類裡面的屬性,因此就出現了下面的setType($type)方法,通過外部調用來達到修改內部屬性值的效果!

物件導向的寫法,在java裡面特別明顯。

好處當然有,封裝、安全。

特別是在第三方類庫中很明顯,封裝

作為庫函數,你只要告訴別人你有什麼功能,能提供什麼功能,內部使用的變數盡量不要暴露出來,使用者只關心功能就好了。

如果我要傳入了一個josnd(誤操作),怎麼辦?
各種參數檢測是不是把display撐爆了?display明明只要一個類型就好了,管這麼多幹什嗎?
分層、封裝!

public function display($type = 'json'){    $this->type = $type;    .....}

物件導向編程 和 函數式編程 的區別;

搜到知乎上這個回答:

編程說穿了就是兩個方面,data和這些data上的operation,

oop, 就是讓operation 圍繞data, 這樣的好處是,當你要添加新的data type的時候,好方便! 原來寫的代碼都不用改。 但是你要給已經寫好的data type添加方法怎麼辦? 比如我要你給java內建的string 加個 python那種乘法。

functional programming採取的是另一種思路,data更多的圍繞operation, 所以添加新的方法很容易。 這就是著名的the expression problem. 誰優誰劣,要看應用情境,寫GUI用oop好不暢快,寫interpreter我更喜歡函數式的。

在我看來這些都是idiom, 不是宗教,具體問題具體分析。 但是學習functional programming絕對大有裨益,因為國內的電腦教育太強調圖靈模型(也就是C語言一脈)了,而對lambda calculus涉及太少,造成了很多偏見和誤解,我不只一次在知乎上看到,學好C語言,其他進階語言都很容易理解的論調,明顯就是受了這種教育的荼毒。

作者:張無忌 連結:https://www.zhihu.com/question/19732025/...
來源:知乎 著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

莫名其妙的被人踩,只能說言盡於此。

因為display應該是不改變狀態的。

其實如果這個setType僅僅是幹這樣的一件簡單的事情,那就是過度封裝了,如果這個setType還做了參數檢查,錯誤異常處理等等,就像你說的,一個方法盡量只做一件事,結合具體的事情去看,就會發現不同之處,不這麼做也不是不可以,總之最後想要的就是代碼邏輯清晰,好維護,修改,後面的人看得懂,不吃力。

拋開需求談代碼,都是耍流氓

你說的那種方式,傳遞,肯定是可以的
但是如果在全域中用到了這個參數,你不賦值到屬性中,而還是傳遞,那麼你想想,是傳參數方便,還是直接在方法中調用屬性方便,物件導向編程,這個參數就是對象的屬性.
當這個參數只在當前方法中用到,那你也可以不賦值到屬性中.

兩種都支援不是更好,setType作為預設值,display的參數優先順序更高,代碼改動也很小

因為輸出格式不是每次調用都需要變更的,比如一次執行過程中,要多次輸出,那比較常見的情況就是多次輸出的格式是相同的,所以用 settype() 的方式就不需要每次 display 都傳一次格式做為參數;
其實對於這種方式還有改進的空間:可以把json和html輸出做為預設的類型,其他的輸出格式則傳遞一個實現了 display() 介面的對象進來,這樣就可以實現輸出時無限的擴充性。
本質上來說,這種做法的目的是為了實現對象的最大化複用。
什麼是對象的複用?就是一個對象被執行個體化之後,不需要變更它的任何屬性就可以直接被多次使用。

seters/geters
缺點就是你多寫了代碼(開發速度降低)
優點就是加強了封裝性(維護能力增強)

一兩個這樣的封裝也就無所謂了對吧,看在更高維護性的面子上也就忍了。
如果多了,還是另外再寫個load()方法來集體裝載。

你對物件導向不感冒!!

個人感覺主要是複用的問題吧,如果單單使用這一次outtype,那麼直接在display中作為參數確實是更方便

但如果不止display一個方法用到outtype,我感覺作為對象的屬性去設定會更方便

首先必須明白寫這個類的作者覺得在某一個時刻你只需要處理一種格式,不是html就是其他,比如json,所以你執行個體化了一個對象,並把格式設定為json,那以後就直接使用好了,可是如果在實際的使用過程中很多人卻發現需要不停地切換輸出格式,那麼這個類寫得並不怎麼樣,很糟糕,還不如寫成一些工具類,或者直接在display中傳入輸出格式。
我個人建議你不要在html和json中做任何切換,直接定義兩個對對象,一個處理html一個處理json,這樣反而更好,不過我不知道這兩個對象是否是可變化的,如果是可變化的,還不如自己寫一個有參數的display方法

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.