【问题标题】:PHP - Get the child class method name in the parent scopePHP - 获取父范围内的子类方法名称
【发布时间】:2015-03-08 09:40:45
【问题描述】:

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

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

【问题讨论】:

  • B::foo 和父类的构造函数有什么关系?
  • 您能澄清一下您要做什么吗?你在 A 的构造函数中添加的注释似乎表明你要输出 B::foo,但是构造函数是在 foo 之前调用的。
  • @MightyPork 它与构造函数无关。
  • @mtinsley 添加了更多细节。请检查

标签: php class oop inheritance methods


【解决方案1】:

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

$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 了解更多信息。

【讨论】:

    【解决方案2】:

    以正确的方式做事。

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-17
      • 2021-08-21
      • 1970-01-01
      • 2012-03-23
      • 1970-01-01
      • 2012-10-25
      • 1970-01-01
      相关资源
      最近更新 更多