函数重写需要实例吗?

可能重复:
PHP中的后期静态绑定究竟是什么?

在这个例子中,PHP会打印出“NO”而不是“YES”,与我预期的相反。

如果我删除function c()中的static ,用self::替换self:: $this->然后执行$e = new B; $e->c(); $e = new B; $e->c(); ,事情会起作用。

这是否意味着实例化需要使父类中的函数调用继承类中的重载函数?

(旁边的问题:这是一个PHP的怪癖,还是这个逻辑也适用于大多数其他编程语言?如果是这样,它背后的基本原理是什么?)

class A {
  static function c() {
    self::d();
  }
  static function d() {
    echo "NO :(n";
  }
}

class B extends A {
  static function d() {
    echo "YES :)n";
  }
}

B::c();

您需要使用static关键字而不是self$this

<?php

class A {
    static function c() {
        static::d();
    }
    static function d() {
        echo "NO :(n";
    }
}

class B extends A {
     static function d() {
         echo "YES :)n";
     }
}

B::c();

// YES :)

这种行为称为延迟静态绑定。

链接地址: http://www.djcxy.com/p/58031.html

上一篇: Is instantiation required for function overriding?

下一篇: Calling a derived static method from a method in parent class in PHP