2010-06-16 80 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实例的引用。但它确实使过程更加严格,并且您的文档可以通过这种方式指出其工作原理。

也许这是有用的,它似乎适用于类似的问题,我很好。

相关问题