2013-12-13 39 views
1

直接在__construct中設置屬性是不好的做法。這些代碼塊之一是否更適合面向對象的PHP?直接在__construct中設置屬性是不好的做法嗎?

我知道這是不好的做法,這樣做的類外...

class person { 
    protected $name; 

    function __construct($persons_name) { 
     $this->set_name($persons_name); 
    } 
    function set_name($new_name){ 
     $this->name = $new_name; 
    } 
} 

VS.

class person { 
    protected $name; 

    function __construct($persons_name) { 
     $this->name = $persons_name; 
    } 
    function set_name($new_name){ 
     $this->name = $new_name; 
    } 
} 
+0

無論如何,我認爲''set_name()'是不好的練習,因爲你應該使用'__set()'。其他人則認爲,獲得者和制定者都是不好的練習。拿你的選擇。 – 2013-12-13 19:49:03

+0

有沒有什麼好書可以學習正確的PHP OOP方法? –

+2

'set_name()'在這裏是多餘的,因爲你的屬性是公共的。爲什麼有人要用一種方法來改變它呢?讓它保護或私人只是這樣你可以有一個理由使用該方法也不是一個好主意。安裝程序適用於有充分理由直接無法訪問的屬性 –

回答

1

這兩個陳述基本上都可以。有一點點區別你應該注意:

  • set_name()方法是可覆蓋的。這意味着擴展該方法的函數可以改變它的行爲。這也不好或壞,你應該考慮是否期望你的應用程序做到這一點。

  • 正如hek2mgl所述,您還可以使用該方法執行其他任務來驗證構造函數生成的數據並避免重複的代碼。

  • 其次是表現。雖然你永遠不應該將性能作爲優先級進行編碼(總是首先要清理可讀的代碼),但使用方法會使服務器花費幾個CPU週期,這在其他地方可能很有用。

如果你希望你的應用程序使用的set_name()方法,並使其「針對重載安全」您可以使用final關鍵字。

0

儘管在這個例子中它沒有區別,第二個是「更好」。這是因爲通常你會在setter方法中包含一些驗證檢查或類似的東西。所以,直接設置屬性時,你會繞過它們。

思考面向對象的設計時,另一個重要一點是,如果您呼叫的二傳手,爲您提供分等級的可能性,改變的過程,而不需要覆蓋整個構造

+0

這可能會導致在模型中包含業務邏輯。大多數情況下,製片人只是一個製片人。 – Jessica

+0

@ hek2mgl您的意思是第一個更好,因爲'_ persons「設置了'_ persons_name'時,它可以像setter一樣驗證它嗎? –

+0

是的,如果有一些驗證,或者計劃在setter中運行的類型檢查,爲什麼繞過它們?如果制定者真的只設置了價值,沒有任何進一步的檢查,那麼你可以使用公共財產 – hek2mgl

1

它不是」事實被認爲是不好的做法;它實際上只取決於set_name($name)實際上在做什麼。

如果您只是直接從參數設置變量的值(例如在您的問題中),那麼會出現額外函數調用的性能成本。這將是一個非常小的。

但是,如果您在編輯/修改參數前設置了參數,那麼最好將函數封裝在方法中以避免代碼重複。

+1

在OP的問題中不使用setter方法的原因實際上與性能沒有任何關係(我們在這裏說的是微秒) - 它有有明智的,可讀的代碼。如果你已經擁有了屬性的新值,那麼你不應該使用setter方法來更新公共屬性......爲什麼當'$ this-> property = $ value;'有效時編寫一個方法?我能想到的唯一警告是,如果你懷疑某處可能會使該屬性變爲私有,或者將來可能會改變屬性設置過程以涉及更復雜的邏輯。 –

+0

@BenD我對性能的評論並不意味着推斷這是不使用setter的主要原因;只需要考慮一點,因此「非常小」。我同意*取決於正在修改的內容,包含的財產的可見性。 – AlexP

0

我認爲,它主要歸結爲個人喜好。但是,有些值不能直接設置給變量,比如新的類實例,必須在構造函數中賦值。

相關問題