new static() であっても new self() であっても、新しいオブジェクトは新しいです。この記事では、PHP オブジェクト指向における new self() と new static() の違いを中心に紹介します。必要な方は一緒に見てみましょう。
違いは次のとおりです:
最初に結論を明確にします。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() によって返された同じクラス、つまり現在静的メソッドを呼び出しているクラスを指します。このキーワードは静的メソッドへのアクセスも有効です。
次の例は、 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
関連する推奨事項:
PHP の基本的なオブジェクト指向概念のサンプルチュートリアル
以上がPHP の new self() と new static() の違いの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。