ホームページ バックエンド開発 PHPチュートリアル 遅延静的バインディングについて、それを解決する方法

遅延静的バインディングについて、それを解決する方法

Jun 13, 2016 pm 01:36 PM
class function self static

後期静的バインディングについて
後期静的バインディングについて PHP のマニュアルを読みましたが、元のアドレスは http://cn2.php.net/manual/zh/ language.oop5.late です。 -static-bindings.php

4 番目の例

PHP コード
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->
&lt;?php
class A {
    public static function foo() {
        static::who();
    }

    public static function who() {
        echo __CLASS__.&quot;\n&quot;;
    }
}

class B extends A {
    public static function test() {
        A::foo();
        parent::foo();
        self::foo();
    }

    public static function who() {
        echo __CLASS__.&quot;\n&quot;;
    }
}
class C extends B {
    public static function who() {
        echo __CLASS__.&quot;\n&quot;;
    }
}

C::test();
?&gt;

ログイン後にコピー

結果は次のようになります:
A
C
C
呼び出されたとき 親::foo() と self::foo() のときにクラス C の who() が呼び出されるのはなぜですか?
どなたか説明していただけますか、ありがとうございます。

-----解決策--------------------------------
静的演算子の説明:
遅延静的バインディングは、ランタイムによって最初に呼び出されたクラスを表すキーワードを導入することで制限を回避しようとします。
最初に呼び出されるクラスは C

A::foo(); 呼び出されるメソッドはクラス A です、これは理解されています
self::foo(); // この self は実はCクラス。わかりますか? C::test() C は B の test() メソッド
parent::foo(); // self::who() の代わりに static::who(); を継承します。このメソッドによって呼び出される現在のクラスは、クラス C の foo() メソッドです

おそらく、C の who() メソッドがクラス A で呼び出されない理由をまだ理解していないかもしれません。これは特別な理由によるものです。親子関係の性質。遅延静的バインディングは、特にサブクラスと親クラスの間で継承されたメソッドの問題を解決するために登場しました。
------解決策---------
マニュアルは非常に分かりやすいですね?
-------------------------------------------------- ----
「遅延バインディング」とは、static:: が現在のメソッドが定義されているクラスに解析されず、実際の実行時に計算されることを意味します。静的メソッドの呼び出し (ただし、それに限定されない) に使用できるため、「静的バインディング」とも呼ばれます。
----------------------------------------------- --- --------

#1 は小さな問題があると言いました

PHP コード
self::foo(); // この self は実際には C クラスです。わかりますか? C::test() C は B の test() メソッドを継承します <div class="clear"></div>
ログイン後にコピー
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

e からの NameResolutionError(self.host, self, e) の理由とその解決方法 e からの NameResolutionError(self.host, self, e) の理由とその解決方法 Mar 01, 2024 pm 01:20 PM

e からの NameResolutionError(self.host, self, e) の理由とその解決方法

Python でクラスとメソッドを使用する方法 Python でクラスとメソッドを使用する方法 Apr 21, 2023 pm 02:28 PM

Python でクラスとメソッドを使用する方法

機能とはどういう意味ですか? 機能とはどういう意味ですか? Aug 04, 2023 am 10:33 AM

機能とはどういう意味ですか?

jQueryを使用して要素のクラス名を置換する jQueryを使用して要素のクラス名を置換する Feb 24, 2024 pm 11:03 PM

jQueryを使用して要素のクラス名を置換する

Pythonにおけるクラスとは何を意味するのでしょうか? Pythonにおけるクラスとは何を意味するのでしょうか? May 21, 2019 pm 05:10 PM

Pythonにおけるクラスとは何を意味するのでしょうか?

Pythonでselfを使用する方法 Pythonでselfを使用する方法 May 17, 2023 pm 10:40 PM

Pythonでselfを使用する方法

SpringBoot がカスタム クラスローダーを通じてクラス ファイルを暗号化および保護する方法 SpringBoot がカスタム クラスローダーを通じてクラス ファイルを暗号化および保護する方法 May 11, 2023 pm 09:07 PM

SpringBoot がカスタム クラスローダーを通じてクラス ファイルを暗号化および保護する方法

Javaの事前定義されたClassオブジェクトのメソッド Javaの事前定義されたClassオブジェクトのメソッド Jul 01, 2023 pm 06:41 PM

Javaの事前定義されたClassオブジェクトのメソッド

See all articles