[php クラスとオブジェクト] 遅延静的バインディング

不言
リリース: 2023-03-24 08:06:02
オリジナル
1278 人が閲覧しました

この記事では、一定の参考値を持つ [php クラスとオブジェクト] 後期静的バインディングの内容を紹介します。必要な友達はそれを参照してください

後期静的バインディング

PHP 5.3.0

。用途: 継承スコープ内の静的に呼び出されたクラスの参照

動作原理:

  • 前の「非転送呼び出し」のクラス名を保存します。

  • 静的メソッド呼び出しを行う場合、クラス名は明示的に指定されたものです (通常は :: 演算子の左側)。オブジェクトが属する種類。

  • 呼び出しの転送: self::、parent::、static::、forward_static_call() による静的呼び出し (静的メソッドの呼び出し)。

    get_called_class() 関数を使用して、呼び出されたメソッドのクラス名を取得でき、static:: はそのスコープを指します。
この機能は、言語内部の観点から「遅延静的バインディング」と呼ばれています。

「遅延バインディング」とは、static:: が現在のメソッドが定義されているクラスに解析されず、実際の実行時に計算されることを意味します。
静的メソッドの呼び出しに使用できる (ただし、それに限定されない) ため、「静的バインディング」とも呼ばれます。

<?phpclass A {
    public static function who() {
        echo __CLASS__; //返回该类被定义时的名字
    }    public static function test() {
        self::who();
    }
}class B extends A {
    // public static function who() {
    //     echo __CLASS__;
    // }}

B::test();  //A?>
ログイン後にコピー
ログイン後にコピー



後期静的バインディングの使用法


後期静的バインディングは、実行時に最初に呼び出されるクラスを表す新しいキーワードを導入することで制限を回避することを目的としていました。 簡単に言えば、このキーワードを使用すると、上記の例で test() を呼び出すときに、クラス A の代わりにクラス B を参照できるようになります。最終的には、新しいキーワードを導入せず、すでに予約されている静的キーワードを使用することが決定されました。

Example #2 static:: 简单用法<?phpclass A {
    public static function who() {
        echo __CLASS__;
    }    public static function test() {
        static::who(); // 注意使用static,后期静态绑定从这里开始
    }
}class B extends A {
    public static function who() {
        echo __CLASS__;
    }
}

B::test();  //B?>
ログイン後にコピー
ログイン後にコピー

非静的環境では、呼び出されるクラスはオブジェクト インスタンスが属するクラスです。 $this-> は同じスコープ内の private メソッドを呼び出そうとするため、static:: は異なる結果を返す可能性があります。

もう 1 つの違いは、static:: は静的プロパティにのみ使用できることです。

遅い静的バインディング


PHP 5.3.0

用途: 継承スコープ内の静的に呼び出されるクラスへの参照

動作原理:

以前の「非転送呼び出し」(非転送呼び出し) クラスを保存します名前。

  • 静的メソッド呼び出しを行う場合、クラス名は明示的に指定されたものです (通常は :: 演算子の左側)。オブジェクトが属する種類。

  • 呼び出しの転送: self::、parent::、static::、forward_static_call() による静的呼び出し (静的メソッドの呼び出し)。

    get_called_class() 関数を使用して、呼び出されたメソッドのクラス名を取得でき、static:: はそのスコープを指します。
  • この機能は、言語内部の観点から「遅延静的バインディング」と呼ばれています。

    「遅延バインディング」とは、static:: が現在のメソッドが定義されているクラスに解析されず、実際の実行時に計算されることを意味します。

    静的メソッドの呼び出しに使用できる (ただし、それに限定されない) ため、「静的バインディング」とも呼ばれます。
  • <?phpclass A {
        public static function who() {
            echo __CLASS__; //返回该类被定义时的名字
        }    public static function test() {
            self::who();
        }
    }class B extends A {
        // public static function who() {
        //     echo __CLASS__;
        // }}
    
    B::test();  //A?>
    ログイン後にコピー
    ログイン後にコピー


後期静的バインディングの使用法


後期静的バインディングは、実行時に最初に呼び出されるクラスを表す新しいキーワードを導入することで制限を回避することを目的としていました。

簡単に言えば、このキーワードを使用すると、上記の例で test() を呼び出すときに、クラス A の代わりにクラス B を参照できるようになります。最終的には、新しいキーワードを導入せず、すでに予約されている静的キーワードを使用することが決定されました。
Example #2 static:: 简单用法<?phpclass A {
    public static function who() {
        echo __CLASS__;
    }    public static function test() {
        static::who(); // 注意使用static,后期静态绑定从这里开始
    }
}class B extends A {
    public static function who() {
        echo __CLASS__;
    }
}

B::test();  //B?>
ログイン後にコピー
ログイン後にコピー

非静的環境では、呼び出されるクラスはオブジェクト インスタンスが属するクラスです。 $this-> は同じスコープ内の private メソッドを呼び出そうとするため、static:: は異なる結果を返す可能性があります。 もう 1 つの違いは、static:: は静的プロパティにのみ使用できることです。

関連する推奨事項:

【phpクラスとオブジェクト】型制約


【phpクラスとオブジェクト】オブジェクトコピー

【phpクラスとオブジェクト】マジックメソッド

以上が[php クラスとオブジェクト] 遅延静的バインディングの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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