Apakah perbezaan antara kelas PHP sendiri dan statik? Bagaimana cara menggunakannya?

藏色散人
Lepaskan: 2023-04-10 16:40:01
ke hadapan
3848 orang telah melayarinya

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();
Salin selepas log masuk
// 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();
Salin selepas log masuk
// 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();
Salin selepas log masuk
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() 的区别?
Salin selepas log masuk

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();
Salin selepas log masuk

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();
Salin selepas log masuk

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.

Pembelajaran yang disyorkan: "Tutorial Video PHP"

Atas ialah kandungan terperinci Apakah perbezaan antara kelas PHP sendiri dan statik? Bagaimana cara menggunakannya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:segmentfault.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan