2011-07-04 46 views
1

示例代码:是否可以确定某个方法是从一个类的内部还是外部调用的?

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 
+4

最有可能不会,这使我们想到的问题:*为什么*你需要这个?你试图解决的实际问题是什么? –

+0

如果方法是从外部类调用的,但不需要从内部安全的地方执行,我需要清理输入变量。 – rsk82

+1

在这种情况下,@dnagirl有最好的回答。 –

回答

3

它可能会更容易,而不是检测函数从哪里被调用,以包装一个公用的私人函数。像这样:

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 
2

你可以试试,让你的方法的调用者:

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

这应该为你工作。

+1

从来不知道'debug_backtrace();',+1为你 – Cyclone

+0

这实际上是错误的,它总是会显示'echo_msg' – GWW

+2

@GWW:这不是完整的实现,只是允许它的机制。事实上,我认为上面的代码只是提问者感兴趣的功能的测试平台/采样器。 – sergio

0

您可以添加一个可选的参数,像这样:

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

,离开去年。如果你是从课堂内部调用它,通过它true,否则什么都不传!

+0

这只是太傻瓜了,我不会依赖它。 –

相关问题