我的一些PHP域對象具有的屬性應該從對象外部設置,但僅限於某些客戶端對象。我該如何去執行這個?如何僅允許授權客戶端訪問對象屬性
我在課堂上使用setter,並提供了一種方法來區分不同的調用者,我確信我可以在setter中進行一些檢查。這看起來有些複雜。我感覺我會違反OO設計原則(也許「告訴,不要問」?)。
我想這是一個相當普遍的情況。我錯過了什麼?
我的一些PHP域對象具有的屬性應該從對象外部設置,但僅限於某些客戶端對象。我該如何去執行這個?如何僅允許授權客戶端訪問對象屬性
我在課堂上使用setter,並提供了一種方法來區分不同的調用者,我確信我可以在setter中進行一些檢查。這看起來有些複雜。我感覺我會違反OO設計原則(也許「告訴,不要問」?)。
我想這是一個相當普遍的情況。我錯過了什麼?
在這種情況下,這是一個糟糕的設計。你會違反班級的單一責任原則。相反,將代碼重構爲多個類,但使用組合來附加可選屬性。
例如:
class MyDataObject {
private $main_property;
private $extended_property;
/* ... getters/setters for $main_property. */
public function set_extended_property(IExtendedProperty $property) {
$this->extended_property = $property;
}
}
哪裏IExtendedProperty
是爲自定義屬性數據的接口。
嗨,Joshua,不知道你的意思。這裏你在主類中使用了一個setter,這正是我目前正在做的。你不區分不同的來電者。任何客戶都可以打電話給你的設定者...... –
判別來電者的問題是:你的班級不應該對他們的方法調用有什麼看法。調用者使用自定義屬性創建對象的新實例,或者將自定義數據注入類的實例(如上面的代碼),而不是嘗試過濾和控制方法調用。 – jmkeyes
我認爲一個好的ACL也會幫助我。 –