3

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

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

如果我删除staticon function c(),替换self::$this->and do $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();
4

1 回答 1

7

您需要使用static关键字而不是selfor $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 :)

这种行为称为后期静态绑定

于 2012-10-04T13:36:23.453 回答