2011-07-28 30 views
3

我剛開始學習面向對象編程,只是通過觀察發現,在所有示例中,成員變量都是私有的。爲什麼通常是這種情況?爲什麼成員變量通常是私有的?

// Class 
class Building { 
    // Object variables/properties 
    private $number_of_floors = 5; // These buildings have 5 floors 
    private $color; 

    // Class constructor 
    public function __construct($paint) { 
     $this->color = $paint; 
    } 

    public function describe() { 
     printf('This building has %d floors. It is %s in color.', 
      $this->number_of_floors, 
      $this->color 
     ); 
    } 
} 

此外,如果您聲明成員變量是公共的,那麼在它聲明的類之外訪問它的語法是什麼?

最後,你必須在前面加上「公共」或「私人」的一類內的每個變量和函數?

編輯:感謝所有的答案,任何人都可以請您確認是否要在前面加上「公共」或「私人」的一類內的每個變量和函數?

謝謝!

+3

這聽起來像你需要閱讀一本關於面向對象編程的書。你已經問過關於面向對象編程基礎的一些非常好的直接問題。我沒有足夠的時間來獲得完整的答案,所以我只能說查看'Encapsulation','Inheritance'和'Abstraction'。 – zzzzBov

回答

2

私有變量不能從外部訪問,這讓你控制。

但如果你把它們公開,那麼你可以訪問它艾克這個

$your_object_instance->Your_variable 

例如

$building = new Building(); 
echo $building->number_of_floors; 

,但你必須把你的number_of_floors變量公開,如果你想訪問私有成員,那麼你需要在建築類中實現新的方法

public function getNumberOfFloors() 
{ 
    return $this->number_of_floors; 
} 

所以你R代碼裏面應該是這樣的

$building = new Building(); 
echo $building->getNumberofFloors(); 
+0

謝謝Senad,所以你必須在班級內的每個變量和函數上加上「public」或「private」嗎? – user784637

+0

對於方法,如果你不公開或公開的方法是公開的,對於變量,如果你只是把var $變量,那麼它的公共。 –

0

使私有變量不斷從取決於你的類的實現細節,所以你以後可以改變實現在不破壞調用代碼調用代碼。

你可以聲明多個變量在同一條線上,並且只使用privatepublic一次:

private $number_of_floors = 5, $color; 

參見PHP文檔‘Classes and Objects’。

1

這使編碼更容易爲你,讓你不太可能犯錯誤。其思想是隻有類可以訪問其私有變量,因此代碼中其他任何類都不能以意外的方式更改私有變量,從而干擾和混淆某些事物。像這樣編寫代碼,通過少量嚴格控制的公共方法進行交互的一羣自治類似乎是一種更簡單的代碼編寫方式。大項目更容易理解,因爲它們被分解爲大小不一的塊。

0

Senad的回答是,這是良好的編程習慣,使你不希望外部的方法來訪問私有變量正確。

然而,在內存管理/垃圾回收的語言推理是,當你保持一個對象的引用,它是不能夠進行垃圾回收,並可能導致內存泄漏。

希望這會有所幫助!

0

我真的不知道該如何回答這樣的問題,但我描述ü最好按照PHP手冊

的屬性或方法的可見性可以通過與公衆的關鍵字前綴的 聲明來定義,受保護或私密。 成員公開的成員可以隨處訪問。被保護的成員 只能在類中被訪問,並被 繼承和父類所訪問。聲明爲私有的成員可能只有定義成員的類訪問的 。

屬性顯示

類屬性必須被定義爲公共,私人或保護。如果使用var聲明 ,則該屬性將被定義爲public。

Methods declared without any explicit visibility keyword are defined as public. 

更多信息參見Visibility

0

這是爲了防止從外部直接操作和可能把對象插入到不一致的狀態的性質。

面向對象的基本原理之一是對象應該負責維護自己的狀態並保持其內部的一致性,例如不允許一個只能保持正整數的屬性被設置爲-343.239或確保內部陣列的結構正確。這樣做的一個肯定的方式是使屬性的值不可能從外部直接設置。通過將該屬性設爲私有,您可以防止外部代碼直接操作它,從而迫使它通過您爲該作業編寫的setter方法。這個setter可以檢查建議的更改不會將對象置於不一致狀態,並防止發生任何更改。

大多數針對初學者的書籍和示例都傾向於使用非常簡單的對象,因此您爲什麼需要瀏覽所有私有屬性以及getter和setter摩爾金,但隨着對象複雜性的增加,好處變得越來越明顯。不幸的是,對於初學者來說,複雜的對象也不是很好,所以這一點很容易就會丟失。

3

經驗法則是儘量隱藏信息,只在絕對必要時共享信息。

  • 俄羅斯程序員有時候說公共莫羅佐夫在不必要的寬訪問修飾符,暗指關於不當信息披露和有關造成進一步的處罰故事 - Pavlik Morozov

    一名13歲男孩譴責他的父親當局,並反過來被他的家人殺害...

+1

是不是一個原則的例子? :)(與您對Programers.SE的評論相關,儘管他們是相關的 - 沒關係) –