Bagi kebanyakan PHP, dua kata kunci PHP sendiri dan statik bukanlah sesuatu yang asing. Kami belajar memanggil sifat statik dan kaedah kelas semasa melalui self::xxxx
. Dan bagaimana dengan statik? Ramai orang mungkin hanya tahu bahawa ia digunakan untuk menentukan kaedah statik dan kata kunci atribut kelas.
Ini juga pemahaman saya sebelum ini.
Sekarang mari kita semak beberapa kegunaan biasa kedua-dua kata kunci ini:
// 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();
Penggunaan biasa kata kunci statik juga terdapat dalam 3 contoh di atas yang ditunjukkan secara menyeluruh.
Saya amat percaya bahawa penggunaan di atas sangat biasa kepada mana-mana PHPer peringkat permulaan. Apa yang saya ingin bincangkan sekarang ialah dua cara berikut:
new self() 与 new static() 的区别?
Saya percaya ramai orang tahu bahawa new self()
mencipta objek kelas semasa, tetapi mereka tidak tahu bahawa new static()
boleh juga mencipta objek kelas semasa.
Mengenai penggunaan new static()
, ia dijelaskan dalam dokumentasi rasmi. Alamat: https://www.php.net/manual/zh/language.oop5.late-static-bindings.php
PHP secara rasmi memanggil kaedah ini: pengikatan statik lewat.
Contoh rasmi 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();
Kerana Kelas B mewarisi Kelas A. Kedua-dua A dan B mempunyai kaedah statik who()
. Pada masa ini, apabila melepasi B::test()
, apa yang sebenarnya dipanggil ialah kaedah who()
Kelas A.
Oleh kerana kaedah statik who()
subkelas Kelas B ditakrifkan dalam subkelas selepas Kelas A. Ciri lalai PHP hanya membenarkan yang pertama ditakrifkan dipanggil.
Ini membawa kepada konsep pengikatan statik lewat.
Contoh Rasmi 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();
Selepas kami menukar test()
badan kaedah self
dalam Kelas A kepada static
, statik sentiasa menunjuk ke kelas panggilan. Maksudnya, walaupun kaedah yang ditakrifkan dalam kelas induk Kelas A bercanggah dengan subkelas dengan nama yang sama. Walau bagaimanapun, apabila subkelas memanggilnya, ia secara automatik bertukar kepada kaedah statik subkelas dengan nama yang sama. Bergantung pada pemanggil.
Anda boleh faham dengan menjalankan dua contoh di atas.
Sebab bahagian ini. Masalah ini berlaku kerana saya terpaksa mewarisi kaedah tunggal semasa operasi sebenar. Oleh itu, ciri ini terlibat.