PHP オブジェクト指向における new self() と new static の違い

高洛峰
リリース: 2016-11-16 11:13:26
オリジナル
1207 人が閲覧しました

まず結論を明確にします。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
ログイン後にコピー


関連ラベル:
php
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!