簡體   English   中英

如何訪問 PHP 中父 object 的 class 變量?

[英]How do I access class variables of a parent object in PHP?

class A 的一個實例實例化了幾個其他對象,例如來自 class B:

$foo = new B();

我想從 B 中的方法訪問 A 的公共 class 變量。

除非我遺漏了什么,否則唯一的方法是將當前的 object 傳遞給 B 的實例:

$foo = new B($this);

這是最佳做法還是有其他方法可以做到這一點?

這對我來說看起來不錯,我傾向於使用“維護這個的人會理解它嗎?”的經驗法則。 這是一個易於理解的解決方案。

如果只有一個“A”,您可以考慮使用注冊表模式,例如http://www.phppatterns.com/docs/design/the_registry

我會首先檢查您是否使用了錯誤的模式:從您的應用程序邏輯來看,B 真的應該知道 A 嗎? 如果 B 需要了解 A,那么親子關系似乎還不夠。 例如,A 可以是孩子,或者 A 的邏輯的一部分可以 go 進入第三個 object,它在層次結構中“低於”B(即不知道 B)。

也就是說,我建議你在 B 中有一個方法來將 A 注冊為數據源,或者在 A 中創建一個方法來將 B 注冊為觀察者,並在 B 中創建一個匹配方法,A 用來通知 B 值更改。

與 Paul 所說的類似,如果只有一個 A,您可以將其實現為 singleton。 然后,您可以將 A 的實例作為參數傳遞給構造函數(聚合),使用 setter 方法(本質上再次聚合),或者您可以直接在構造函數中設置此關系(組合)。

然而,雖然單例很強大,但要小心使用組合來實現它們。 很高興認為您可以這樣做並擺脫構造函數參數,但這也使得在不重寫代碼的情況下無法用其他東西替換 A。 就個人而言,我會堅持聚合,即使使用 singleton

$foo = new B( A::getInstance() );
$foo = new B($this);

不幸的是,這樣的代碼不符合我的需求。 還有其他方法可以訪問父 object 屬性嗎?

我將嘗試解釋原因。 我們編寫了一個游戲軟件,一些類具有非常“不尋常”的依賴關系,並以不同的方式相互影響。 這就是為什么代碼有時在每個實例中如果沒有與父級的鏈接就幾乎無法支持(有時甚至來自不同上下文的多個父級,即一個小隊可能屬於 Battle 和 User 等......)。

現在鏈接不滿足我的原因。 當我為客戶端生成一個 output 時,我使用了 XML 中的一種序列化對象。 它工作得非常好,直到它遇到遞歸引用,比如那些指向父母的鏈接。 我可以使它們受到保護,但隨后它們就失去了使用,即(虛擬示例)

$this->squad->battle->getTeam($tid)->getSquad($sqid)->damageCreature(...);

另一種方式 - 在每個可序列化的 class 中實現序列化方法並在序列化程序中調用它,如下所示:

$obj->toXML($node);
$this->appendChild($node);

但有很多東西要寫和支持。 有時我會動態地為序列化程序生成對象(更少的流量)。

我什至想到了一個技巧:“教”序列化程序忽略某些類中的某些屬性))。 呃……壞主意……

這是一個漫長的討論,但相信我,Registry 和 Observer 不適合。 還有其他想法嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM