PHP - 获取父作用域中的子类方法名称

时间:2015-01-09 23:57:40

标签: php class oop inheritance methods

如何在非静态上下文中从父作用域获取子类方法名称?

使用__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();

2 个答案:

答案 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