3

重複の可能性:
PHP の遅延静的バインディングとは正確には何ですか?

この例では、PHP は予想とは逆に、"YES" ではなく "NO" を出力します。

onを削除staticfunction c()、置き換えself::$this->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の代わりにキーワードを使用する必要があります。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と呼ばれます。

于 2012-10-04T13:36:23.453 に答える