从PHP中调用函数的位置获取类名


Get name of a class from where the function was called in PHP

我有两个独立的类,其中一个是日志类。我希望能够在不传递任何参数的情况下告诉哪个类正在调用日志类函数。

<?php
class Log {
    public function general($message) {
        // Tell which class/function is calling this function here
        $class = get_called_class();
        echo 'Your message was: "'.$message.'" from class: "'.$class.'"';
    }
}
class foo {
    public function log_something() {
        $Log = new Log();
        $Log->general('Hello, world!');
    }
}
$foo = new Foo();
$foo->log_something();
?>
我想要的输出是:Your message was "Hello, world!" from class "foo"

然而,我得到的消息是:Your message was "Hello, world!" from class "Log"

我错过了什么,还是做错了什么?

您只是在Foo内部创建Log对象,因此您的get_called_class()调用将始终导致Log。如果你想要这种行为,你需要让Foo继承Log。例如:

<?php
class Log {
    public function msg($message) {
        // Tell which class/function is calling this function here
        $class = get_called_class();
        echo 'Your message was: "'.$message.'" from class: "'.$class.'"';
    }
}
class Foo extends Log {
  public function doSomething() {
    $this->msg( 'Hello World!' );
  }
}
$foo = new Foo();
$foo->doSomething();

输出:

Your message was: "Hello World!" from class: "Foo"

我能够通过使用debug_backtrace()找出问题的答案

<?php
class Log {
    private function get_call_class() {
        $backtrace = debug_backtrace();
        $classes = array();
        foreach ($backtrace as $item) {
            if ($item['class'] != '' && $item['class'] != 'Log') $classes[] = $item['class'];
        }
        return $classes[0];
    }
    public function general($message) {
        // Tell which class/function is calling this function here
        $class = $this->get_call_class();
        echo 'Your message was: "'.$message.'" from class: "'.$class.'"';
    }
}

class foo {
    public function log_something() {
        $Log = new Log();
        $Log->general('Hello, world!');
    }
}
$foo = new Foo();
$foo->log_something();
?>

解释:Log->get_call_class()函数从debug_backtrace()获取信息,并循环查找没有'Log'名称或空白名称的类,然后返回第一个结果,这是我正在寻找的。