在PHP中获取实际的类名

时间:2015-03-08 15:54:02

标签: php inheritance

以下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函数(在类Base中)是否可以区分调用类?

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

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

尝试:

我尝试使用get_called_class函数代替get_class函数,我也尝试使用get_class($this)。 Hoewever,即使从$my函数调用,它们也将返回Childbase_action实例的类的名称。结果输出是:

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

这不是我正在寻找的......

我还尝试“覆盖”log类中的Child函数,并在调用get_class函数时传递parent::log()的值:

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");
    }
}

这有效,但有点挫败了继承的目的。这是一种解决方法,但可以更直接地实现吗?

2 个答案:

答案 0 :(得分:0)

查看debug_backtrace:

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

通过呼叫者/呼叫者解析并根据需要保存遍历信息。

答案 1 :(得分:0)

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

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