在 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 的名称 $my
是 Child
的实例,即使从 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";
}
以下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 的名称 $my
是 Child
的实例,即使从 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";
}