Php 是否可以确定方法是从类内部还是外部调用的?

Php 是否可以确定方法是从类内部还是外部调用的?,php,oop,Php,Oop,示例代码: class MyClass { function echo_msg { echo // now what... } function echo_from_inside { $this->echo_msg() } } result should be: $my_instance = new MyClass(); $my_instance->echo_msg(); // I was called from

示例代码:

class MyClass {
    function echo_msg {
        echo // now what...
    }

    function echo_from_inside {
        $this->echo_msg()
    }
}

result should be:

$my_instance = new MyClass();
$my_instance->echo_msg(); // I was called from OUTside
$my_instance->echo_from_inside(); // I was called from INside

您可以尝试获取方法的调用方:

$trace = debug_backtrace();
$caller = array_shift($trace);
echo 'called by '.$caller['function']
echo 'called by '.$caller['class']

这应该适合您。

您可以尝试获取方法的调用者:

$trace = debug_backtrace();
$caller = array_shift($trace);
echo 'called by '.$caller['function']
echo 'called by '.$caller['class']

这应该适合您。

您可以添加如下可选参数:

function echo_msg($ins=false) {
        if($ins){/*called from inside*/}else{/*called from outside*/}
        echo // now what...
    }

最后一个。如果您是从类内部调用它,请将其传递为true,否则不传递任何内容

您可以添加如下可选参数:

function echo_msg($ins=false) {
        if($ins){/*called from inside*/}else{/*called from outside*/}
        echo // now what...
    }

最后一个。如果您是从类内部调用它,请将其传递为true,否则不传递任何内容

用公共函数包装私有函数可能比检测从何处调用函数更容易。像这样:

class MyClass{
  private function myob(){
    //do something
  }

  public function echo_msg(){
    $this->myob();
    //do other stuff like set a flag since it was a public call
  }

  private function foo(){ //some other internal function
    //do stuff and call myob
    $this->myob();
  }
}

$obj=new MyClass();
$obj->echo_msg();//get output
$obj->myob();  //throws error because method is private

用公共函数包装私有函数可能比检测函数从何处调用更容易。像这样:

class MyClass{
  private function myob(){
    //do something
  }

  public function echo_msg(){
    $this->myob();
    //do other stuff like set a flag since it was a public call
  }

  private function foo(){ //some other internal function
    //do stuff and call myob
    $this->myob();
  }
}

$obj=new MyClass();
$obj->echo_msg();//get output
$obj->myob();  //throws error because method is private

很可能不是,这就引出了一个问题:你为什么需要这个?您试图解决的实际问题是什么?如果方法是从类外调用的,我需要清理输入变量,但不需要从安全的内部执行。在这种情况下,@dnagirl在我看来是最好的答案。很可能不是,这就引出了一个问题:您为什么需要这个?您试图解决的实际问题是什么?如果方法是从类外调用的,我需要清理输入变量,但不需要从安全的内部执行。在这种情况下,@dnagirl在我看来有最好的答案。我从来不知道debug_backtrace+1为you@GWW:这不是完整的实现,只是允许它的机制。事实上,我认为上面的代码只是询问者感兴趣的功能的测试床/采样器+1为you@GWW:这不是完整的实现,只是允许它的机制。事实上,我认为上面的代码只是询问者感兴趣的功能的测试床/采样器。这太容易愚弄了,我不会依赖它。这太容易愚弄了,我不会依赖它。