在 PHP 中获取实际的 class 名称

Get the actual class name in PHP

以下PHP代码:

class Base {
    protected function log($msg) {
        echo get_class() . ": $msg\n";
    }
    public function base_action() {
        $this->log("some message from base_action");
    }
}

class Child extends Base {
    public function child_action() {
        $this->log("some message from child_action");
    }
}

$my = new Child();
$my->base_action();
$my->child_action();

将输出:

Base: some message from base_action
Base: some message from child_action

符合预期。

我的问题:

log函数(在classBase中)是否可以区分调用classes?

我想在这里看到的输出是:

Base: some message from base_action
Child: some message from child_action

尝试过:

我试过使用 get_called_class 函数而不是 get_class 函数,我也试过使用 get_class($this)。 Hoewever,两者都将 return class 的名称 $myChild 的实例,即使从 base_action 函数调用也是如此。结果输出为:

Child: some message from base_action
Child: some message from child_action

这不是我要找的...

我还尝试 'override' Child class 中的 log 函数,并在调用 get_class 时传递 get_class 的值=28=]函数:

class Base {
    protected function log($msg, $class = null) {
        if (is_null($class)) {
            $class = get_class();
        }
        echo "$class: $msg\n";
    }
    public function base_action() {
        self::log("some message from base_action");
    }
}

class Child extends Base {
    protected function log($msg, $class = null) {
        if (is_null($class)) {
            $class = get_class();
        }
        parent::log($msg, $class);
    }
    public function child_action() {
        self::log("some message from child_action");
    }
}

这可行,但有点违背了继承的目的。这是一种变通方法,但可以更直接地实现吗?

查看 debug_backtrace:

http://php.net/manual/en/function.debug-backtrace.php

解析callers/call-ees并根据需要保存遍历信息

您可以查找 class 调用堆栈中的最后一个条目。可以使用 debug_backtrace()

获取调用堆栈本身
protected function log($msg) {
    $backtrace = debug_backtrace();
    $lastCall = array_pop($backtrace);
    echo $lastCall['class'] . ": $msg\n";
}