PHP:当前函数是否在对象内部运行?

PHP:当前函数是否在对象内部运行?,php,object,scope,Php,Object,Scope,PHP中是否有任何方法可以判断函数是从特定对象类的内部还是外部运行的 function getToDaChoppa() { if( "we're inside the Choppa object" ) { $foo = "We're inside"; } else { $foo = "We're outside"; } echo $foo; } class Choppa() { public function getSta

PHP中是否有任何方法可以判断函数是从特定对象类的内部还是外部运行的

function getToDaChoppa() {
    if( "we're inside the Choppa object" ) {
        $foo = "We're inside";
    } else {
        $foo = "We're outside";
    }
    echo $foo;
}

class Choppa() {
    public function getStatus() {
        getToDaChoppa();
    }
}
运行:

getToDaChoppa();
( new Choppa )->getStatus();
应回应:

我们在外面


我们在里面

您可以使用
debug\u backtrace()
,返回一个跃点,然后检查这是否是从类内部生成的。我不确定我会不会在生产中这样做

function getToDaChoppa() {
    $bt = debug_backtrace();
    if (isset($bt[1]) && array_key_exists('class', $bt[1])) {
        echo "called from class\n";
    } else {
        echo "called directly\n";
    }
}
澄清:如果您希望它仅为一个特定类触发:

function getToDaChoppa() {
    $bt = debug_backtrace();
    if (
        isset($bt[1]) &&
        array_key_exists('class', $bt[1]) &&
        $bt[1]['class'] === 'Choppa'
    ) {
        echo "called from class Choppa\n";
    } else {
        echo "called otherwise\n";
    }
}

函数本身不知道它是否从类调用,这是有充分理由的。如果函数的行为不同,则会导致代码无法维护和调试困难等

如果您需要调用函数,并且可能会询问,如果此函数属于类/获取实例,那么唯一的方法是。但一般来说,您实际上只应该为调试代码执行此操作(顾名思义)


通常,对于每种情况,您只需使用两个函数,或者传递一个存储所需信息的参数。

您始终可以在默认值的基础上传递类的实例,然后在返回
get_class()
时进行求值


请参阅以获取一个工作示例。

\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu类
将在后一种情况下设置。
获取类($this)
返回什么?等等<代码>\uuuu类仅为类内定义的函数设置。你是在班里叫一个全局的吗?我认为这是一个完全正确的问题。同样有趣的一点是,我听过解决方案,因为在我多年的编码生涯中,我从未做过这样的事情:)从类中调用全局函数不会传递有关调用它的类的任何信息-您需要使用
debug\u backtrace
或类似方法来找出函数的调用位置。或者,将实例作为
$context
变量传递给函数。如果它是从与
chopa
不同的类调用的,它是否也会返回
“从类调用”
?它将为任何类触发。如果只想为一个特定类触发,只需检查
$bt[1]['class']
的值。
function getToDaChoppa($that = false) {
    $class = $that ? get_class($that) : '';
    if($class == "Choppa") {
        $foo = "We're inside";
    } else {
        $foo = "We're outside";
    }
    echo $foo;
}

class Choppa {
    public function getStatus() {
        getToDaChoppa($this);
    }
}


getToDaChoppa(); // Would return "We're outside" 
( new Choppa )->getStatus(); // Would return "We're inside"