2010-03-27 47 views
2

有什麼辦法讓調用者函數獲得除debug_backtrace()之外的東西嗎?PHP:朋友類和不真實的來電函數/類

我在尋找一種較不貪心的方式來模擬示範如的朋友內部

比方說,我有一個A類和B類

到現在爲止,我一直在使用debug_backtrace(),這也太貪婪(恕我直言)

我認爲是這樣的:

<?php 

    class A 
    { 
     public function __construct(B $callerObj) {} 
    } 

    class B 
    { 
     public function someMethod() 
     { 
      $obj = new A($this); 
     } 
    } 
?> 

,如果你想將其限制在一個特定的類這可能是好的,但讓我們說我有300級,我想將其限制在25他們?

一種方法可以使用接口聚合:

public function __construct(CallerInterface $callerObj)

但它仍然是一個醜陋的代碼

此外,你不能使用那招與靜態類。

有什麼更好的想法嗎?

+1

我真的不能回答你關於php部分的問題,但是我想要評論一下,使用接口是一個非常強大和穩固的解決方案。沒有什麼醜陋的。至少,不是你提供的例子。 – Henri

+0

@亨利:正如我在我的文章中所說的「而且,你*不能*使用*靜態類的那個技巧*。」 – avetisk

回答

2

您可以撥打debug_backtrace(FALSE),然後不填充對象索引。這會加快一點,但通常情況下,生產代碼中應避免debug_backtrace,除非您的應用程序是速度不是問題的軟件工具,或者將其用於錯誤處理。

從我個人理解,你想

  • 必須在被叫方提供主叫方和
  • 外部訪問私有和受保護的屬性到選定類的隱式引用。

兩者都不存在於PHP中(並打破封裝imho)。對於討論,請參閱

+1

感謝這兩個鏈接。 我發現自己,PHP開發團隊*「對朋友聲明進行了處理」*:http://bugs.php.net/bug.php?id=34044 這真的太糟糕了。 無論如何,感謝您的建議! – avetisk

6

PHP確實沒有提供給您處理這個優雅的方式。沒有意義開始一種語言的火焰戰爭,我會小心翼翼地提出你的設計技能和需求可能超過了你的工具的限制。 PHP是一種輕量級的腳本語言,它具有很多僞OOP特性,但是在它的核心,它並沒有設計用於優雅的企業架構。

+0

+1爲微妙而非常真實的一點! – Henri

+1

請解釋什麼是適合優雅企業架構的語言。另外,請解釋爲什麼PHP在Tiobe索引中排名第三,爲什麼世界上最大的社交網絡運行PHP?另外,請解釋爲什麼在JavaScript1.3中不推薦使用argument.caller,因爲它可以隱式地從被調用者訪問外部作用域。 – Gordon

+3

受歡迎度與設計質量之間的關係極其鬆散。正如我上面所說的,我的意圖是避免發起語言的火焰戰爭,並且我完全避免提出任何其他平臺建議。如果你想討論語言的優點,我們可以在線下進行,但這不是爭論的地方。 –