以下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
函数调用,它们也将返回Child
是base_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");
}
}
这有效,但有点挫败了继承的目的。这是一种解决方法,但可以更直接地实现吗?
答案 0 :(得分:0)
答案 1 :(得分:0)
您可以查找调用堆栈中最后一个条目所具有的类。可以使用debug_backtrace()
protected function log($msg) {
$backtrace = debug_backtrace();
$lastCall = array_pop($backtrace);
echo $lastCall['class'] . ": $msg\n";
}