关于后期静态绑定,该怎么解决
关于后期静态绑定
看了php手册中关于后期静态绑定,还是不太明白,原文地址http://cn2.php.net/manual/zh/language.oop5.late-static-bindings.php
其中第四个例子
- PHP code
<!--Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--><?phpclass A { public static function foo() { static::who(); } public static function who() { echo __CLASS__."\n"; }}class B extends A { public static function test() { A::foo(); parent::foo(); self::foo(); } public static function who() { echo __CLASS__."\n"; }}class C extends B { public static function who() { echo __CLASS__."\n"; }}C::test();?>
结果是:
A
C
C
当调用到parent::foo()和self::foo()时,为什么会调用C类的who()?
哪位朋友能解释一下,谢谢。
------解决方案--------------------
关于static操作符的解释:
后期静态绑定试图通过引入一个关键字表示运行时最初调用的类来绕过限制。
而这个最初调用的类就是C
A::foo(); 调用的是A类的方法,这你明白
self::foo(); // 这个self实际上是C类。明白吗? C::test() C继承了B的test()方法
parent::foo(); // 由于static::who(); 而不是self::who()。该方法调用的当前的类,也就是C类的foo()方法
也许你觉得还是弄不懂 A类中又为什么没有调用C的who()方法,这是由于parent的特殊关系。延迟静态绑定就是专门为了解决子类与父类间继承方法的问题才出现的。
------解决方案--------------------
手册不是说得很清楚么
------------------------------------------------------
”后期绑定“的意思是说,static::不再被解析为定义当前方法所在的类,而是在实际运行时计算的。也可以称之为”静态绑定“,因为它可以用于(但不限于)静态方法的调用。
-------------------------------------------------------
#1说的有个小问题
- PHP code
self::foo(); // 这个self实际上是C类。明白吗? C::test() C继承了B的test()方法<div class="clear"> </div>

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック









ファンクションとは、関数を意味します。これは、特定の関数を備えた再利用可能なコード ブロックです。プログラムの基本コンポーネントの 1 つです。入力パラメータを受け取り、特定の操作を実行し、結果を返すことができます。その目的は、再利用可能なコード ブロックをカプセル化することです。コードの再利用性と保守性を向上させるコード。

Linux での whoami と whoami コマンドの使用法と違いには、特定のコード例が必要です。Linux システムでは、whoami と whoami は一般的に使用される 2 つのコマンドで、現在ログインしているユーザーのユーザー名を表示するために使用されます。機能は似ていますが、使用方法と出力結果にはいくつかの違いがあります。この記事では、これら 2 つのコマンドの使用法と違いを紹介し、具体的なコード例を示します。 whoami コマンド whoami コマンドは、現在ログインしているユーザーのユーザー名を表示するために使用します。何も必要ありません

毎年、Apple が iOS と macOS の新しいメジャー バージョンをリリースする前に、ユーザーは数か月前にベータ版をダウンロードして最初に体験することができます。同ソフトウェアは一般ユーザーと開発者の両方が使用するため、Appleは開発者向けベータ版のパブリックベータ版である開発者版とパブリック版を両方向けに開始した。 iOS の開発者バージョンとパブリック バージョンの違いは何ですか?文字通りに言うと、開発者バージョンは開発者テスト バージョンであり、パブリック バージョンは公開テスト バージョンです。開発者バージョンとパブリック バージョンは、異なるユーザーを対象としています。開発者バージョンは、Apple が開発者によるテストのために使用します。ダウンロードしてアップグレードするには、Apple 開発者アカウントが必要です。

この記事では、Python の enumerate() 関数と「enumerate()」関数の目的について学びます。 enumerate() 関数とは何ですか? Python の enumerate() 関数は、データ コレクションをパラメータとして受け取り、列挙オブジェクトを返します。列挙オブジェクトはキーと値のペアとして返されます。キーは各項目に対応するインデックス、値は項目です。構文 enumerate(iterable,start) パラメータ iterable - 渡されたデータ コレクションは、iterablestart と呼ばれる列挙オブジェクトとして返すことができます。 - 名前が示すように、列挙オブジェクトの開始インデックスは start によって定義されます。無視したら

MySQL.proc テーブルの役割と機能の詳細な説明。MySQL は人気のあるリレーショナル データベース管理システムです。開発者が MySQL を使用する場合、多くの場合、ストアド プロシージャ (StoredProcedure) の作成と管理が必要になります。 MySQL.proc テーブルは非常に重要なシステム テーブルであり、ストアド プロシージャの名前、定義、パラメータなど、データベース内のすべてのストアド プロシージャに関連する情報が保存されます。この記事では、MySQL.proc テーブルの役割と機能について詳しく説明します。

C 言語における static の役割と使用法: 1. 変数スコープ; 2. ライフサイクル; 3. 内部関数; 4. グローバル変数の変更; 5. 関数の変更; 6. その他の用途; 詳細な紹介: 1. 変数スコープの場合変数の前に static キーワードがある場合、変数のスコープは、変数が宣言されているファイルに制限されます。言い換えると、変数は「ファイル レベルのスコープ」であり、「」の発生を防ぐのに非常に役立ちます。変数の重複定義問題; 2. ライフサイクル、静的変数はプログラム実行開始時に一度初期化され、プログラム終了時に破棄されるなど。

1. static まず次のプログラムを見てください: publicclassHello{publicstaticvoidmain(String[]args){//(1)System.out.println("Hello, world!");//(2)}}セグメント プログラムは、Java を学習したことのあるほとんどの人には馴染みのあるものです。 Java を学習したことがなくても、C などの他の高級言語を学習したことがある場合でも、このコードの意味は理解できるはずです。これは単に「Hello, world」を出力するだけであり、他に用途はありませんが、静的キーワードの主な目的を示しています。

Vue の使い方と機能.use Function Vue は、多くの便利な機能を提供する人気のフロントエンド フレームワークです。その 1 つは Vue.use 関数で、これを使用すると Vue アプリケーションでプラグインを使用できるようになります。この記事では、Vue.use 関数の使い方と機能を紹介し、いくつかのコード例を示します。 Vue.use 関数の基本的な使用法は非常に簡単です。Vue がインスタンス化される前に関数を呼び出し、使用するプラグインをパラメータとして渡すだけです。簡単な例を次に示します。 // プラグインの導入と使用
