2012-04-20 54 views
7

變量封裝,Set/Get方法是最佳實踐,但爲什麼我們有機會聲明一個變量public,如果它不打算被使用呢?如果變量總是默認爲私有的,沒有機會讓它們公開,那麼它會更好嗎?因爲我讀過的所有教程都說它們應該用set/get方法封裝起來?至少在PHP OOP中是否有公共變量的有效用例?在PHP OOP中使用公共變量是否有任何有效用例?

+0

有用於保護變量的類(例如繼承/覆蓋),但我不知道任何公共的。這可能是由於在PHP 5中被解釋爲public的類中的php 4 var $ var聲明造成的。 – Hajo 2012-04-20 11:29:45

+2

簡單的答案:因爲** not **(wanting)使用getters和setters有各種完全有效的理由,所以你可以簡單地訪問公共變量。 – CodeCaster 2012-04-20 11:30:51

+0

@CodeCaster在大多數情況下的動態oop顯示我認爲不好的設計。 – Hajo 2012-04-20 11:32:33

回答

8

事實上,它只是另一種方式:理論上,獲取者/設置者是錯誤。這些屬性定義了一個對象的狀態,這些方法定義了行爲。 Getters/Setter只攔截對屬性的讀寫訪問,但它們完全破壞語義:現在讀取對象的狀態是對象的行爲。

爲了讓性能的樣子性質又存在道路:) https://wiki.php.net/rfc/propertygetsetsyntax

1

設置在RFC/Get方法是最好的做法,但爲什麼我們有機會來聲明一個變量市民如果它是不是意味着要用嗎?

最佳實踐和不打算使用的是不一樣的。一種語言需要爲不同的使用情況提供不同的工具,並且應該一致。

PHP對象始終支持公共成員,並且在引入差異可見性時,出於向後兼容的原因,公共成員非常有用。

如果變量總是默認爲私有的,沒有機會讓它們公開,那麼會更好嗎?因爲我讀過的所有教程都說它們應該用set/get方法封裝?

這個問題不能具體回答,這太主觀了,太多不同的用例會導致不同的答案。

至少在PHP OOP中是否有公共變量的任何有效用例?

開始向後兼容。如果你不能重構你的代碼,但需要一直重寫它,這將是非常昂貴的。

-1

讓我們來看看.. 這是一個真實世界的電子郵件API類CakePHP EmailComponent。使用這個類,你只需要在「設置」部分物業然後就send()

$this->Email->to = '[email protected]'; 
$this->Email->from = '[email protected]'; 
$this->Email->title = 'xxx'; 
$this->Email->msg = 'blabla..'; 
$this->Email->send(); 

其實有很多這樣的類中私有屬性和功能,但它是私有的。

有(單一)責任做某事。 封裝僅公佈人們用來做這件事情,並保持技術/基礎設施內部爲私人

相關問題