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
.
如何在非静态上下文中从父范围获取子 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
.