2011-05-10 80 views
2

假設我想構建一個使用延遲加載機制的數據庫抽象層。用其他對象就地替換對象

如果我要求圖層加載一個根對象,它會加載它的外部表示並構造它自己。

然後它以某種方式確定存在某些鏈接的對象。由於加載所有前期代碼可能代價高昂,因此它會爲相關對象建立代理。這樣的代理應該能夠通過。

如果在這樣的代理上調用第一個消息,它將加載其外部表示並構造它自己。由於對代理的引用可能已被傳遞,所創建的對象需要替換現有的代理對象。

我能在原地用PHP中的另一個對象替換對象嗎?

+0

請給出幾個示例代碼片段。替換'$ this = new obj'是不可能的,但是它聽起來像是真正的'&'相關對象的引用可能只適用於一次。但是通用代理/攔截對象也是一個選項,具體取決於複雜性。 – mario 2011-05-10 21:17:53

+0

我想知道,這可能不是一個解決方案 - 因爲PHP中的引用不是可以找到的引用,例如我可能會在明天添加代碼。今天太遲了。 – SteAp 2011-05-10 22:11:08

回答

2

我不相信一個對象可以用另一個對象替換所有對自身的引用。相反,使用overloading讓代理對象轉發屬性訪問和方法調用。在基本代理對象(名爲OOProxy)上實現代理,然後將其擴展爲延遲加載代理對象的LazyProxy類。只要您不需要檢查對象的類型,那麼對代理引用的任何內容都將無法將其與代理進行區分。

+0

Thx!是的,使用代理服務器像真正的對象適配器將是標準的方法。 – SteAp 2011-05-10 22:09:05

+1

只要你總是使用引用而不使用新的,就有可能。說這是一個骯髒的黑客,應該在實踐中避免...看到:[與PHP自動裝箱](http://bit.ly/eSuuzJ)... – ircmaxell 2011-05-10 23:40:47