可以限制在PHP中调用方法的方式吗?

可以限制在PHP中调用方法的方式吗?,php,scope,methods,Php,Scope,Methods,鉴于我的班级是这样的: class Methods{ function a(){ return 'a'; } function b(){ $this->a(); } function c(){ $this->a(); } } 是否可以确保只能从函数b调用函数a 在上面的示例中,函数c应该失败。我可以将其包含在函数b中,但将来我可能想让一些新函数调用a()(例如d()或

鉴于我的班级是这样的:

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

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

    function c(){ 
        $this->a();
    }  
}
是否可以确保只能从函数b调用函数a


在上面的示例中,函数c应该失败。我可以将其包含在函数b中,但将来我可能想让一些新函数调用
a()
(例如
d()
或e
()

从学习方法之间的差异开始。。。在想做像这样极其复杂的事情之前,至少掌握OOP的基本知识是很有用的。 是的,可以使用debug_backtrace()来标识方法调用的来源;但这是一个非常大的开销。。。。我认为设置这样的限制没有实际意义。

不太可能

  • 您可以通过检查()的结果来检查调用方
  • 您可以将其设置为私有,以避免从类外部调用它,然后将c()移到类外部

您应该首先看看类可见性修饰符,就像马克·贝克建议的那样。这可能就是你要找的

但是,如果不是,则以下代码应适用于您:

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();
    }
}

我认为没有必要限制同一类中的方法调用其他方法

也许你的模型错了,你必须创建两个类?一个类应该是一个逻辑单元


如果您使用单独的类,您可以使用on方法
a
,并且不能再从类外调用它。

最接近您所要求的是您想要限制它的方法内的。在定义闭包的方法之外无法访问闭包。这些方法通常用于定义回调并传递给其他方法,但您可以直接调用它

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

    $a();   
  }

  function c(){ 
    $this->a(); // fails
  }  
}
使方法私有受保护将防止从类外调用它,但不会限制类内哪些方法可以访问它。在某种程度上,您需要相信您的代码能够遵循API的使用规则

类通常是信任的单元封装,如果您将方法从外部使用为私有,并对其进行文档化,那么您应该能够信任它在类中得到了正确的使用。如果不是,也许这个类已经变得太大了,是时候重构了


正如@Sjoerd所提到的,您也可以检查调用堆栈,但是同意@Mark Baker的观点,这几乎没有价值;这类似于滥用语言,也会使您的代码一团糟。

以下内容可能适用于您的问题

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
实例的引用。但它确实使流程更加严格,并且您的文档可以说明它以这种方式工作的原因


也许这是有用的,它似乎适用于一个类似的问题,我有相当好的。

没有(丑陋的黑客除外)。你为什么要那样做?你想实现什么?好吧,我会采取另一种方式,因为大家普遍认为这个想法很糟糕……如果
c()
不应该调用
a()
不要在
c()中调用它