まず結論を明確にします。PHP では、self は現在呼び出されているメソッドを定義するクラスを指し、static は現在の静的メソッドを呼び出すクラスを指します。
以下は上記の結果を証明する例です
class A { public static $_a = 'Class A'; public static function echoProperty() { echo self::$_a . PHP_EOL; } } class B extends A { public static $_a = 'Class B'; } $obj = new B(); B::echoProperty();//输出 ‘Class A
なぜこのようになるかというと、self::や__CLASS__を使って現在のクラスを静的に参照するのは、呼び出されるメソッドが定義されているクラスに依存するからです。上記のクラス A メソッド echoProperty は次のように変更されます:
class A { public static $_a = 'Class A'; public static function echoProperty() { echo static::$_a . PHP_EOL; } } //再次调用B::echoProperty将输出 'CLASS B'
上記の最初の例で見られたサブクラスが親クラスの静的プロパティを上書きするのを避けるために、継承されたメソッドを使用して引き続き親クラスの静的プロパティにアクセスします。 、PHP5.3 では、新しい構文が追加されています: self キーワードの代わりに static キーワードを使用する後期静的バインディング。これにより、static は get_called_class() によって返された同じクラス、つまり、現在 static メソッドを呼び出しているクラスを指します。キーワードは静的メソッドへのアクセスにも有効です。
次の例は、 new self() と new static() の違いをよりよく示しています (後者は、PHP の遅延静的バインディングを使用して、呼び出しメソッドの現在のクラスを指します)
class A { public static function get_self() { return new self(); } public static function get_static() { return new static(); } } class B extends A {} echo get_class(B::get_self()); // A echo get_class(B::get_static()); // B echo get_class(A::get_self()); // A echo get_class(A::get_static()); // A