A類的實例實例一對夫婦的其他對象的,比方說從B類:如何在PHP中訪問父對象的類變量?
$foo = new B();
我想從方法來訪問內部B.
A的公共類變量,除非我失去了一些東西,要做到這一點的唯一方法是對當前對象傳遞給B的情況:
$foo = new B($this);
這是最好的做法還是有另一種方式來做到這一點?
A類的實例實例一對夫婦的其他對象的,比方說從B類:如何在PHP中訪問父對象的類變量?
$foo = new B();
我想從方法來訪問內部B.
A的公共類變量,除非我失去了一些東西,要做到這一點的唯一方法是對當前對象傳遞給B的情況:
$foo = new B($this);
這是最好的做法還是有另一種方式來做到這一點?
對我來說這看起來很好,我傾向於使用「會有人維持這種理解嗎?」的經驗法則嗎?這是一個容易理解的解決方案。
如果只有一個「A」,你可以考慮使用註冊表模式,見例如http://www.phppatterns.com/docs/design/the_registry
我會先檢查你是否使用了錯誤的模式:從你的應用程序邏輯,B應該真的知道A嗎?如果B需要了解A,親子關係似乎不夠充分。例如,A可以是孩子,或者A的邏輯的一部分可以進入層次結構中「低於」B的第三個對象(即,不知道B)。
也就是說,我建議你在B中有一個方法來註冊A作爲數據源,或者在A中創建一個方法來將B註冊爲Observer和B中的一個匹配方法,A用來通知B的值變化。
什麼保羅說,如果只有一個A,你可以實現,作爲一個單身類似。然後,您可以將A的實例作爲參數傳遞給構造函數(聚合),並使用setter方法(實質上是再次聚合),也可以直接在構造函數(composition)中設置此關係。
然而,雖然單身人士是強大的,但要小心與組成一起實施它們。很高興認爲你可以這樣做並且擺脫構造函數的參數,但是它也使得用別的代碼替換A而不用代碼重寫是不可能的。 Peronsally,我會與聚集堅持,即使使用單
$foo = new B(A::getInstance());
$foo = new B($this);
這樣的代碼遺憾的是不符合我的需求。有沒有其他的方式來訪問父對象的屬性?
我會盡力解釋原因。我們編寫遊戲軟件,一些課程具有非常「不尋常」的依賴性,並以不同方式相互影響。這就是爲什麼在每種情況下,沒有與父母聯繫的情況下,代碼有時幾乎不可支持(有時甚至是來自不同情境的幾個父母,即一個小隊可能屬於戰鬥和用戶等等)。
而現在鏈接不滿足我的原因。當我爲客戶端生成輸出時,我使用XML中的一種序列化對象。它工作得很好,直到遇到像父母的鏈接那樣的遞歸引用。我可以讓他們受到保護,但是隨後他們放棄了他們的使用(虛擬實例)
$this->squad->battle->getTeam($tid)->getSquad($sqid)->damageCreature(...);
另一種方式 - 來實現序列化方法在每一個序列化類並調用它內部串行這樣的:
$obj->toXML($node);
$this->appendChild($node);
但是這是一個很大的東西,寫和支持!有時我會動態生成串行器的對象(流量較少)。
我什至想到一個黑客:「教」串行器忽略某些屬性在某些classess))。呃...不好主意...
這是一個長時間的討論,但相信我,註冊表和觀察員不適合。還有其他想法嗎?
謝謝。在我的特殊情況下,註冊表模式確實適用。 (A類打開多個數據庫鏈接,必須將配置信息傳遞給B和其他類。) – 2008-09-15 12:24:24