如何在非静态上下文中从父作用域获取子类方法名称?
使用__METHOD__
魔术常量获取当前方法名称很简单,但我试图获取启动请求的方法。
get_class($this)
返回超类范围内的调用者类。需要类似的获取方法实现。
例如:
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();
答案 0 :(得分:0)
似乎对如何实例化对象存在误解。在创建新对象时调用构造函数,而不是在调用该对象的方法时调用。使用您提供的代码,执行此行时将调用A&#39的构造函数:
$b = new B();
在调用$b->foo()
时,已经创建了对象,并且不会再次调用构造函数。您的请求是"知道哪种方法发起了呼叫"没有意义,因为方法调用不会初始化对象。
如果由于某种原因您需要在其父级构造函数中确定对象的类型,则可以使用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__
常量不同,后者将是当前方法所属的类,无论它是否是实现类的实例。
有关详细信息,请参阅Late Static Binding。
答案 1 :(得分:0)
以正确的方式行事。
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”索引,因此省略了所有函数/方法参数,以节省内存。第二个参数将堆栈帧限制为2
。