2010-11-03 58 views
0

可能重複:
Why use getters and setters?直接或通過函數訪問對象的變量是否更好?

哪種方法更好的做法?

$user = new User(); 
$user->username = "bob"; 
$user->password = "password"; 
$user->age = 42; 

echo $user->username; 

$user = new User(); 
$user->setUsername("bob")->setPassword("password")->setAge(42); 

echo $user->getUsername(); 

是更好的做法,以便訪問和方法來設置對象變量或直接用戶是用戶對象模型。提前致謝。

回答

2

最好使用封裝,這是面向對象的最大優點之一。使你的屬性保密,並使用setter和getter來訪問你的屬性。

如果您使用setter,您可以在將值設置爲屬性之前進行檢查。例如: 如果你想確保$ id屬性是一個整數,你可以在你的setter中檢查它。如果你使用直接訪問你的屬性,你不能。如果你想改變一個屬性的檢查,你只需要在一個位置改變它。

因爲使用setters是要走的路,所以你也應該使用getters,否則仍然有可能在不使用setter的情況下設置你的屬性。

請看神奇的__set()和__get()方法,以使您的生活更輕鬆,當涉及到setters和getters時。關於__set和__get(和其他神奇的方法)

的更多信息: http://www.php.net/manual/en/language.oop5.overloading.php#language.oop5.overloading.members

編輯

我與戈登同意。但是值得注意的是使用魔術方法的可能性。

@Axsuul: 當您定義屬性時,請使用私人,公共或受保護的關鍵字。例如:

protected $id; 

private $id; 

http://php.net/manual/en/language.oop5.visibility.php

「類屬性必須被定義爲public,private或protected如果使用VAR沒有明確的聲明。可見性關鍵字,該屬性將被定義爲公共。「

沒有選項可以更改默認的可見性。

+0

神奇的方法是不正確的getter和setter的替代品,將它們用於這個目的比使用常規功能顯著慢。我們也有很多人相信使用受保護的而不是私有的默認可見度。 – Gordon 2010-11-03 09:17:44

+0

如何設置默認的可見性? – axsuul 2010-11-03 09:38:27

+0

@Axsuul對不起,如果這是unlear:我的意思與*默認可見*是寫你的類時要使用的關鍵字。正如Stegemann正確指出的那樣,內部默認可視性不能改變。除非你聲明不同,否則它將被公開。 – Gordon 2010-11-03 10:12:20

0

使用方法(getter和setter,使屬性私有)是'正確的方式',稱爲encapsulation

2

使用私有屬性與setter方法讓你實現對性能的一些基本驗證的機會,因此,如果(例如)名稱和密碼是強制性的,你可以檢查它們是否被稱爲一個有效的價值,並拋出如有異常不。否則,你必須在代碼的其他地方執行此操作。

強制使用干將,您還可以執行其他任務(可能是格式化的電話號碼,或確保名上顯示一個大寫第一個字符,例如),返回之前。

這樣做有一個真正的好處,因爲如果您選擇更改密碼規則,那麼很明顯它在哪裏做到這一點...並且如果在代碼的其餘部分從多個位置調用密碼設置,那麼它是一個單一的驗證邏輯點。