ほとんどの PHP 使用者にとって、self と static という 2 つの PHP キーワードは馴染みのないものではありません。 self::xxxx
を通じて現在のクラスの静的プロパティとメソッドを呼び出す方法を学びます。そして、静電気についてはどうでしょうか?静的メソッドやクラス属性のキーワードを定義するために使われることはご存知の方も多いはずです。
これも私の以前の理解です。
ここで、これら 2 つのキーワードの一般的な使用法をいくつか確認してみましょう:
// self 用法 1 :调用静态成员属性 <?php class Person { protected static $maxAddressCount = 5; // 收获地址创建最大数量。 public function test() { echo self::$maxAddressCount; } } $person = new Person(); $person->test();
// self 用法 2 :调用静态方法 <?php class Person { protected static $maxAddressCount = 5; // 收获地址创建最大数量。 protected static function getMaxAddressCount() { return self::$maxAddressCount; } public function test() { echo self::getMaxAddressCount(); } } $person = new Person(); $person->test();
// self 用法 3 :创建一个当前对象 <?php // 单例示例 class Person { private static $instance = null; private function __construct() {} final public static function getInstance() { if (self::$instance == null) { self::$instance = new self; } return self::$instance; } public function test() { echo "hello world!"; } } $person = Person::getInstance(); $person->test();
静的キーワードの一般的な使用法は、上記の 3 つの例にも包括的に反映されています。
上記の使用法は、初心者レベルの PHPer にとって非常に馴染みのあるものであると確信しています。ここで私が話したいのは、次の 2 つの方法です。
new self() 与 new static() 的区别?
new self()
が現在のクラスのオブジェクトを作成することは多くの人が知っていると思いますが、詳しくは知りません。 new static( )
は現在のクラスのオブジェクトを作成することもできます。
new static()
の使い方については、公式ドキュメントで説明されています。アドレス: https://www.php.net/manual/zh/ language.oop5.late-static-bindings.php
PHP では、このメソッドを正式に「遅延静的バインディング」と呼んでいます。
公式例 1:
<?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();
クラス B はクラス A を継承しているため。 A と B の両方に静的メソッド who()
があります。このとき、B::test()
を渡すと、実際に呼び出されるのはクラスAのwho()
メソッドです。
サブクラスクラスBの静的メソッドwho()
がクラスAの次のサブクラスに定義されているためです。 PHP のデフォルト機能では、最初に定義された機能のみを呼び出すことができます。
これは、遅延静的バインディングの概念につながります。
公式例 2:
<?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();
クラス A の test()
メソッド本体を static## に変更します # の後の static は、常に を指すことを表します。呼び出しクラス。つまり、クラス A の親クラスで定義されたメソッドが、同じ名前のサブクラスと競合します。ただし、サブクラスがそれを呼び出すと、同じ名前のサブクラスの静的メソッドに自動的に切り替わります。発信者によって異なります。
上記の 2 つの例を実行すると理解できます。
推奨学習: 「
PHP ビデオ チュートリアル