函数重写需要实例化吗?

时间:2012-10-04 13:33:55

标签: php oop

  

可能重复:
  What exactly is late-static binding in PHP?

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

如果我删除static上的function c(),请将self::替换为$this->并执行$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();

1 个答案:

答案 0 :(得分:7)

您需要使用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 :)

此行为称为Late Static Bindings