2010-08-02 27 views
2

我想阻止foo()被除B以外的任何其他類執行。我如何檢查哪個類創建了對象A?如何獲取創建當前對象的類?

<?php 
class A 
{ 
    public function foo() 
    { 
     if (.... B) // what should be on the dotts? 
      echo 'I\'m created by class B, which is fine'; 
     else 
      echo 'Execution of foo() is not allowed'; 
    } 
} 

class B 
{ 
    public function go() 
    { 
     $a = new A; 
     $a->foo(); 
    } 
} 

class C 
{ 
    public function go() 
    { 
     $a = new A; 
     $a->foo(); 
    } 
} 

$b = new B; 
$b->go(); // result: I\'m created by class B, which is fine 

$c = New C; 
$c->go(); // result: 'Execution of foo() is not allowed' 
+0

可能的重複[如何在__construct中調用函數名稱而無需debug_backtrace](http://stackoverflow.com/questions/3308406/how-to-get-called-function-name-in-construct-without-debug -backtrace) – Gordon 2010-08-02 11:16:13

回答

3

一個常見問題(例如How to get called function name in __construct without debug_backtrace),但是在一個設計良好的應用程序中,它不應該是一個類需要知道它從哪裏被調用,或防止被請求時被實例化的。

如果您需要此類限制,請將您的類設爲允許訪問它的主類的私有屬性。

如果您絕對必須這樣做,請將調用方作爲參數傳遞給方法,而不是使用可怕的低效率debug_backtrace方法。

+0

我不能限制該方法,因爲它在我使用的框架中聲明爲public。 你最後的選擇似乎是唯一可行的選擇,雖然我需要重載方法來添加額外的參數,但至少'foo()'可以保持公開。 – donnut 2010-08-02 10:17:56

+0

我同意這一點。將調用者傳遞給構造函數並將其存儲在實例中以稍後檢查,或者將其與方法調用一起傳遞。 – Gordon 2010-08-02 11:16:01

0

B類中聲明foo代替,並使其私人和可選的決賽。爲什麼要在A中定義一個只能由B調用的方法?

+0

我給出的例子當然是對現實的簡化。我使用Yii框架,它使用了一個具有方法save()的Model類。 爲了解決多個依賴類的問題,我使用了Facade設計贊助人。 Facade類確實進行了驗證,並正在調用它從世界其他地方隱藏的類的方法。現在我需要防止Facade類包含的類的保存方法可以被Facade類以外的任何其他類使用。其餘的方法都是公開的。 保存()方法是私人的是沒有選擇的,因爲它們是公開的 – donnut 2010-08-02 10:12:54

+0

@donnut你不能只是不泄露外部使用的對象實例到外面? – Artefacto 2010-08-02 10:15:17

+0

這意味着要限制façade正在使用的完整對象而不是其中的一種方法。除了這個方法(save())外,該類可以用於其他情況。 – donnut 2010-08-02 10:21:46

相關問題