今回は、PHP での遅延静的バインディングの使用について詳しく説明します。PHP で遅延静的バインディングを使用する場合の注意点は次のとおりです。
いわゆる遅延静的バインディングは、その名前が示すように、静的に呼び出すと、:: シンボルの左側のバインディングは遅延されます。つまり、バインディングは、次のクラスに解析されなくなります。現在のメソッドは定義されていますが、実際の実行時の計算中です。この記事では主に PHP の遅延静的バインディングに関する内容を紹介します。以下では多くを述べませんが、詳細を見てみましょう。
何か嫌な匂いがします
この期間中にプロジェクトのバックグラウンドで PHP コードを見ていたら、次のようなコードを見つけました。
<?php class DBHandler { function get() {} } class MySQLHandler extends DBHandler { // 这里一个create public static function create() { echo "MySQL"; return new self(); } public function get() { echo "MySQL get()"; } } class MemcachedHandler extends DBHandler { // 这里又有一个create public static function create() { echo "Memcached"; return new self(); } public function get() { echo "Memcached get"; } } function get(DBHandler $handler) { $handler->get(); } $dbHandler = MySQLHandler::create(); get($dbHandler); ?>
Do you何か嫌な匂いがする?ご覧のとおり、MySQLHandler クラスと MemcachedHandler クラスには create 関数があり、出力ステートメントを削除したところ、これらはまったく同じであることがわかりました。はい、コードのリファクタリングが必要です。
簡単なリファクタリングを実行する
コードのリファクタリングは、よく考えて改善があると感じられる限り、キーボードを叩いて作業を開始する必要があります。さあ、上記のコードを次のようにリファクタリングしてください:
<?php class DBHandler { public static function create() { echo "create"; return new self(); } function get() {} } class MySQLHandler extends DBHandler { public function get() { echo "MySQL get()"; } } class MemcachedHandler extends DBHandler { public function get() { echo "Memcached get"; } } function get(DBHandler $handler) { $handler->get(); } $dbHandler = MySQLHandler::create(); get($dbHandler); ?>
create 関数を DBHandler クラスに移動します。これで、不良コードが 1 つ減り、見た目も良くなります。
それは間違っているようです
実行してみましたが、期待した内容が出力されないことがわかりましたMySQL get()
。什么情况?这说明,并没有调用MySQLHandler的get函数,但是代码明明调用了啊,这说明, new self()
このコードには問題があります。これの何が問題なのでしょうか?ここで、今日の要約の焦点である遅延静的バインディングに焦点を当てます。
遅延静的バインディング
遅延静的バインディングは、PHP5.3 以降に導入されました。もう一度次のコードを見てください:
<?php class 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 を出力しますが、B を出力したいのです。これが問題です。これは自分自身とクラスの制限でもあります。現在のメソッドが定義されているクラスに応じて、self:: または CLASS を使用した現在のクラスへの静的参照。したがって、これは、上記のコードが A を出力する理由を非常によく説明しています。しかし、B を出力する必要がある場合はどうすればよいでしょうか?これを行うことができます:
<?php class A { public static function who() { echo CLASS; } public static function test() { static::who(); // 这里有变化,后期静态绑定从这里开始 } } class B extends A { public static function who() { echo CLASS; } } B::test(); ?>
遅延静的バインディングは、実行時に最初に呼び出されるクラスを表す新しいキーワードを導入することで制限を回避しようとしました。簡単に言うと、このキーワードを使用すると、上記の例で test() を呼び出すときに、クラス A の代わりにクラス B を参照できるようになります。最終的には、新しいキーワードを導入せず、すでに予約されている静的キーワードを使用することが決定されました。
これは、後期静的バインディングの根本であり、static キーワードの代替使用法です。記事の冒頭の例では、次のように変更できます:
return new static(); // 改变这里,后期静态绑定
遅延静的バインディングを使用すると、PHP を使用して 23 の デザイン パターン を実装するときに非常にリラックスした気分になります。
この記事の事例を読んだ後は、この方法を習得したと思います。さらに興味深い情報については、php 中国語 Web サイトの他の関連記事に注目してください。
推奨書籍:
オブジェクト指向 PHP に基づいてゲストブックを実装する手順の詳細な説明
以上がPHP での遅延静的バインディングの使用の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。