PHP:是在对象内运行的当前函数吗?

时间:2017-11-03 15:28:53

标签: 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 getStatus() {
        getToDaChoppa();
    }
}

运行:

getToDaChoppa();
( new Choppa )->getStatus();

应该回应:

我们在外面

我们在里面

3 个答案:

答案 0 :(得分:1)

它自己的一个函数不知道,如果它是从类中调用的,并且有充分的理由。如果函数行为不同,那将导致非常难以维护的代码和硬调试等。

如果你需要调用函数并且可能会问,如果这个函数属于一个类/获取实例,那么执行此操作的唯一方法是debug_backtrace。但一般来说,你真的应该这样做,对于调试代码(顾名思义)。

通常情况下,每个案例只有两个函数,或者传递一个存储所需信息的参数。

答案 1 :(得分:0)

您可以使用debug_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";
    }
}

答案 2 :(得分:0)

您总是可以在默认值的基础上传递该类的实例,然后在返回get_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"

有关工作示例,请参阅https://ideone.com/WWg1Hl