PHP - 在父作用域中获取子 class 方法名

PHP - Get the child class method name in the parent scope

如何在非静态上下文中从父范围获取子 class 方法名称?

使用 __METHOD__ 魔术常量获取当前方法名称很简单,但我正在尝试获取发起请求的方法。

get_class($this) returns superclass 范围内的调用者 class。需要类似的获取方法实现。

例如:

class A {
    public function __construct() {
        // Here I want know which method initiated the call.
        // In current scenario its the method foo() of the B class.
    }
}

class B extends A {
    public function foo() {

    }
}

$b = new B();
$b->foo();

似乎对对象的实例化方式存在误解。创建新对象时调用构造函数,而不是调用该对象的方法时调用。使用您提供的代码,执行此行时将调用 A 的构造函数:

$b = new B();

调用$b->foo()时,对象已经创建,不会再调用构造函数。您对 "know which method initiated the call" 的请求没有意义,因为方法调用不会初始化对象。

如果出于某种原因您需要在其父级的构造函数中确定对象的类型,您可以使用 is_a($object, $class_name) 函数。

class A {
    public function __construct() {
        var_dump( is_a($this, 'B') );
    }
}

class B extends A {
    public function foo() {

    }
}

$b = new B();
$b->foo();

以上代码会输出:bool(true)

您还可以使用 get_called_class() 函数来获取对象的实际 class。请注意,这与 __CLASS__ 常量不同,后者将是当前方法所属的 class,无论它是否是实现 class.[=18= 的实例]

有关详细信息,请参阅 Late Static Binding

正确的做法。

class A {
    public function bar() {
        $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2);
        echo $trace[count($trace) - 1]['function'];

        echo __METHOD__;
    }
}

class B extends A {
    public function foo() {
        $this->bar();
    }
}

$b = new B();
$b->foo();

结果

foo
bar

debug_backtrace 参数中,DEBUG_BACKTRACE_IGNORE_ARGS 省略了 "args" 索引,因此省略了所有 function/method 参数,以节省内存。第二个参数将堆栈帧限制为 2.