2010-06-16 74 views
3

考慮到我的課是這樣的:是否可以限制如何在PHP中調用方法?

class Methods{ 
    function a(){ 
     return 'a'; 
    } 

    function b(){ 
     $this->a(); 
    } 

    function c(){ 
     $this->a(); 
    } 
} 

是否可以保證功能的可只能被稱爲從函數b

在上面的例子中,函數c應該失敗。我可以只包括在函數B,但在未來我可能想讓a()通過一些新的函數調用(如d()或E ()

+2

否(不包括醜陋的黑客)。你爲什麼要這麼做?你想達到什麼目的? – Artefacto 2010-06-16 14:55:19

+1

好吧,我會採取另一種方式,因爲普遍的共識是這個想法很糟糕...... – Ash 2010-06-16 15:06:51

+2

如果'c()'不應該調用'a()'不要在'c()'中調用它 – Gordon 2010-06-16 15:07:42

回答

8

開始通過學習public, private and protected方法之間的區別......這是有用的在想要做一些非常複雜的事情之前,至少要掌握面向對象的基礎知識。 是的,可以使用debug_backtrace()來確定調用方法的地方;但是這是一個非常大的開銷......而且我沒有看到實際設置這種限制的價值。

0

不是。

  • 您可以通過檢查)的debug_backtrace結果(
  • 您可以將其變爲私有,以避免它從類的外部被調用,然後在類之外將C()檢查調用。
2

你應該先看看類可見性修飾符,就像Mark Ba​​ker所建議的一樣。這可能是你正在尋找的。

然而,如果不是的話,下面的代碼應該爲你工作:

class Methods 
{ 
    private function a() 
    { 
     $bt = debug_backtrace(); 
     if(!isset($bt[1]) || $bt[1]['function'] != 'b' || $bt[1]['class'] != get_class($this)) 
     { 
      //Call not allowed 
      return NULL; 
     } 
    } 
    function b() 
    { 
     //allowed 
     $this->a(); 
    } 
    function c() 
    { 
     //not allowed 
     $this->a(); 
    } 
} 
+3

那個代碼真的聞起來......這是一個很好的解決方案。 – Cristian 2010-06-16 15:02:02

0

我看到限制同一類內的方法來調用其他方法沒有意義。

也許你的模型是錯誤的,你必須創建兩個類?一個類應該是一個邏輯單元(以某種方式)。

如果您使用單獨的課程,則可以在方法a上使用private keyword,並且不能再從課程外部調用該課程。

1

最接近你要求的是closure (aka anonymous function)你想限制它的方法。在它們定義的方法之外,閉包不可訪問。這些通常用於定義回調並傳遞給其他方法,但可以直接調用它。

class Methods{ 
    function b(){ 
    $a = function() { 
     return 'a'; 
    }; // don't forget the trailing ';' 

    $a(); 
    } 

    function c(){ 
    $this->a(); // fails 
    } 
} 

製作方法私人保護會阻止它從類的外部被調用,但不會將其在類中的方法可以訪問它。在某種程度上,您需要信任您的代碼以遵循API的使用規則。

類通常是信任的單元封裝,如果您從外部使用私有方法並將其記錄下來,您應該能夠相信它在類中正確使用。如果不是,那麼這個班級可能變得太大了,是時候重構了。

正如@Sjoerd所提到的,您也可以檢查調用堆棧,但同意@Mark Ba​​ker認爲在這方面幾乎沒有任何價值;這類似於濫用語言並且使代碼變得混亂。

0

以下內容可能適用於您的問題。

class First { 
    public function a() { 
     $second = new Second(); 

     // Works in this context! 
     $second->b($this); 
    } 
} 

class Second { 
    public function b($context) { 
     if (!$context instanceof First) 
      throw new Exception('Can only be called from context of "First".'); 
     echo 'b'; 
    } 
} 

class Third { 
    public function c() { 
     $second = new Second(); 

     // Doesn't work out of context. 
     $second->b($this); 
    } 
} 

警告這並不妨礙Third從調用方法,因爲它可以提供給Second實例的引用。但它確實使過程更加嚴格,並且您的文檔可以通過這種方式指出其工作原理。

也許這是有用的,它似乎適用於類似的問題,我很好。

相關問題