Jadual Kandungan
Masukkan static : pengikatan statik lewat
Kes penggunaan praktikal untuk static
1. Kaedah Kilang Statik
2. Kaedah Chaining dengan warisan
Kaveat dan batasan
Ringkasan
Rumah pembangunan bahagian belakang tutorial php Statik vs Diri: Membongkar pengikatan statik lewat di PHP

Statik vs Diri: Membongkar pengikatan statik lewat di PHP

Jul 26, 2025 am 09:50 AM
PHP Syntax

Apabila kaedah statik dipanggil menggunakan diri dalam warisan, ia sentiasa menunjuk kepada kelas yang mentakrifkan kaedah, dan bukannya kelas yang sebenarnya dipanggil, mengakibatkan ketidakupayaan untuk memanggil kaedah subclass yang ditindas seperti yang diharapkan; Walaupun statik menggunakan pengikatan statik lewat, yang boleh menghuraikan dengan betul kepada kelas yang sebenarnya dipanggil semasa runtime. 1. Diri adalah mengikat awal, menunjuk ke kelas di mana kod itu terletak; 2. Statik adalah mengikat lewat, menunjuk ke kelas panggilan runtime; 3. Gunakan statik untuk melaksanakan kaedah kilang statik dan secara automatik mengembalikan contoh subkelas; 4. Statik menyokong penguraian yang betul sifat -sifat yang diwarisi dalam rantaian kaedah; 5. LSB hanya sesuai untuk kaedah dan atribut statik, bukan untuk pemalar; 6. Statik harus digunakan terlebih dahulu dalam kelas yang boleh diwarisi untuk meningkatkan fleksibiliti dan skalabilitas, yang disyorkan secara meluas dalam PHP moden.

Statik vs Diri: Membongkar pengikatan statik lewat di PHP

Apabila bekerja dengan warisan di PHP, anda mungkin menemui self dan tertanya -tanya mengapa kadang -kadang ia tidak berkelakuan seperti yang anda harapkan - terutamanya apabila memanggil kaedah statik dari kelas kanak -kanak. Di sinilah pengikatan statik lewat (LSB) dimainkan, dan perbezaan antara self dan static menjadi kejam.

Masalah dengan self

self di PHP merujuk kepada kelas di mana kaedah itu ditakrifkan , tidak semestinya yang memanggilnya. Ini bermakna ia terikat awal - diselesaikan pada masa penyusunan, bukan runtime.

Pertimbangkan contoh ini:

 kelas parentclass {
    fungsi statik awam yang () {
        echo "parentclass \ n";
    }

    fungsi statik awam callwho () {
        diri sendiri :: siapa ();
    }
}

Kelas Childlass memanjangkan ParentClass {
    fungsi statik awam yang () {
        echo "Childlass \ n";
    }
}

ChildClass :: CallWho (); // Output: "Parentclass"

Walaupun kami memanggil callWho() pada ChildClass , ia mengeluarkan ParentClass . Kenapa? Kerana self::who() di dalam ParentClass selalu merujuk kepada ParentClass::who() , tanpa mengira konteks panggilan.

Tingkah laku ini selalunya bukan apa yang anda mahukan ketika merancang hierarki kelas yang berlebihan.


Masukkan static : pengikatan statik lewat

Php 5.3 memperkenalkan pengikatan statik lewat , yang membolehkan static merujuk kepada kelas yang dipanggil pada masa runtime - bukan di mana kaedah itu ditakrifkan.

Mari tweak contoh menggunakan static dan bukannya self :

 kelas parentclass {
    fungsi statik awam yang () {
        echo "parentclass \ n";
    }

    fungsi statik awam callwho () {
        statik :: siapa (); // nota: statik bukan diri sendiri
    }
}

Kelas Childlass memanjangkan ParentClass {
    fungsi statik awam yang () {
        echo "Childlass \ n";
    }
}

ChildClass :: CallWho (); // output: "anak kecil"

Kini ia mencetak ChildClass . Itu kerana static::who() diselesaikan pada runtime berdasarkan kelas sebenar yang digunakan dalam panggilan - ini adalah mengikat lewat .

✅ Peraturan ibu jari:

  • self → merujuk kepada kelas semasa (di mana kod ditulis)
  • static → merujuk kepada kelas yang dipanggil (yang mungkin kanak -kanak)

Kes penggunaan praktikal untuk static

1. Kaedah Kilang Statik

Anda boleh membuat kaedah kilang asas yang mengembalikan contoh kelas kanak -kanak yang betul:

 model kelas {
    fungsi statik awam membuat () {
        kembali statik baru (); // mengembalikan contoh kelas yang dipanggil
    }
}

Pengguna kelas memanjangkan model {
    // mewarisi membuat (), tetapi mengembalikan contoh pengguna
}

$ user = user :: create (); // sebenarnya objek pengguna
var_dump ($ pengguna contoh pengguna); // benar

Tanpa static , anda perlu mengatasi create() dalam setiap kelas kanak -kanak.

2. Kaedah Chaining dengan warisan

 Kelas QueryBuilder {
    Jadual $ statik yang dilindungi;

    fungsi statik awam semua () {
        echo "Memilih dari". Static :: $ Table. "\ n";
    }
}

Pengguna kelas memanjangkan querybuilder {
    statik dilindungi $ Table = 'Users';
}

Pengguna :: semua (); // Output: "Memilih dari Pengguna"

Sekali lagi, static::$table menyelesaikan kepada User::$table , bukan QueryBuilder::$table .


Kaveat dan batasan

  • LSB hanya berfungsi dengan kaedah statik dan panggilan harta.
  • Ia tidak terpakai kepada pemalar ( self::CONST vs static::CONST masih merujuk kepada kelas di mana ia ditakrifkan).
  • Berhati -hati apabila menggunakan static dalam kelas akhir - tidak ada warisan, jadi self dan static berkelakuan sama.
  • Perbezaan prestasi boleh diabaikan; Mengutamakan kejelasan dan tingkah laku yang betul.

Ringkasan

Kata kunci Masa mengikat Merujuk kepada
self Awal (masa kompilasi) Kelas di mana kaedah ditakrifkan
static Lewat (runtime) Kelas sebenar dipanggil

Gunakan static apabila anda mahu kaedah yang diwarisi untuk menghormati pelaksanaan kelas panggilan - terutamanya dalam pangkalan abstrak, kilang, atau antara muka yang fasih.

Dalam PHP moden, nikmat static atas self apabila bekerja dengan kaedah statik dalam kelas yang boleh diwarisi. Ia menjadikan kod anda lebih fleksibel dan intuitif.

Pada asasnya: jika anda membina sesuatu yang dimaksudkan untuk dilanjutkan, static mungkin pilihan yang tepat.

Atas ialah kandungan terperinci Statik vs Diri: Membongkar pengikatan statik lewat di PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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

Alat AI Hot

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Rimworld Odyssey Cara Ikan
1 bulan yang lalu By Jack chen
Apakah had transaksi untuk pengguna asing di Alipay?
1 bulan yang lalu By 下次还敢
Bolehkah saya mempunyai dua akaun Alipay?
1 bulan yang lalu By 下次还敢

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Tutorial PHP
1506
276
Pengenalan kepada atribut Php 8: Mengganti Docblocks dengan Metadata Berstruktur Pengenalan kepada atribut Php 8: Mengganti Docblocks dengan Metadata Berstruktur Jul 25, 2025 pm 12:27 PM

Php8attributesTlaceCblockSformetAdataByProvidingType-safe, natielySupportedAnnotations.1.AttributesSaredEdEdusing#[attribute] danCantRetSsses, kaedah, sifat-sifat, dan lain-lain

Menguasai Pemusnahan Array PHP dan Pengendali Penyebaran Menguasai Pemusnahan Array PHP dan Pengendali Penyebaran Jul 25, 2025 am 04:44 AM

Pengendali dekonstruksi dan pengembangan PHP dapat meningkatkan kebolehbacaan dan fleksibiliti kod melalui sintaks ringkas. 1. Array Deconstruction menyokong mengekstrak nilai dari indeks dan array bersekutu, seperti [$ pertama, $ kedua] = $ warna, yang boleh diberikan secara berasingan; Unsur -unsur boleh dilangkau melalui ruang letak kosong, seperti [, $ ketiga] = $ warna; Dekonstruksi array bersekutu memerlukan => kekunci yang sepadan, seperti ['name' => $ name] = $ pengguna, yang menyokong pembolehubah penamaan semula dan menetapkan nilai lalai untuk menangani kekunci yang hilang. 2. EDVED OPERATOR (...) boleh mengembangkan dan menggabungkan susunan, seperti [... $ warna, 'biru'], yang menyokong gabungan majoriti dan pengaturcaraan array bersekutu, tetapi kunci berikutnya akan menimpa bekas dan tidak menambah.

Adakah sintaks php mudah? Adakah sintaks php mudah? Jul 17, 2025 am 04:12 AM

Ya, phpsyntaxiseasy, terutama sekali-sekala, kerana tidak dapat dipertahankan, integrateswellwithhtml, andrequiresminimalsetup.itssyntaxisstraightforward, membenarkandirectembeddingintohtmlwithtags, menggunakan $ forvariage,

Demystifying PHP Ternary, Null Coalescing, dan Nullsafe Operator Demystifying PHP Ternary, Null Coalescing, dan Nullsafe Operator Jul 25, 2025 pm 04:48 PM

Theternaryoperator(?:)isusedforsimpleif-elselogic,returningoneoftwovaluesbasedonacondition;2.Thenullcoalescingoperator(??)returnstheleftoperandifitisnotnullorundefined,otherwisetherightoperand,makingitidealforsettingdefaultswithoutbeingaffectedbyfals

Statik vs Diri: Membongkar pengikatan statik lewat di PHP Statik vs Diri: Membongkar pengikatan statik lewat di PHP Jul 26, 2025 am 09:50 AM

Apabila kaedah statik dipanggil menggunakan diri dalam warisan, ia sentiasa menunjuk kepada kelas yang mentakrifkan kaedah, dan bukannya kelas yang sebenarnya dipanggil, mengakibatkan ketidakupayaan untuk memanggil kaedah subclass yang ditindas seperti yang diharapkan; Walaupun statik menggunakan pengikatan statik lewat, yang boleh menghuraikan dengan betul kepada kelas yang sebenarnya dipanggil semasa runtime. 1. Diri adalah mengikat awal, menunjuk ke kelas di mana kod itu terletak; 2. Statik adalah mengikat lewat, menunjuk ke kelas panggilan runtime; 3. Gunakan statik untuk melaksanakan kaedah kilang statik dan secara automatik mengembalikan contoh subkelas; 4. Statik menyokong resolusi yang betul sifat -sifat yang diwarisi dalam rantaian kaedah; 5. LSB hanya sesuai untuk kaedah dan atribut statik, bukan untuk pemalar; 6. Statik harus digunakan terlebih dahulu dalam kelas yang boleh diwarisi untuk meningkatkan fleksibiliti dan skalabiliti, yang berada dalam pH moden

Memahami fungsi variadik dan argumen yang membongkar php Memahami fungsi variadik dan argumen yang membongkar php Jul 25, 2025 am 04:50 AM

Fungsi pembolehubah dan parameter pembolehubah PHP dilaksanakan melalui pengendali Splat (...). 1. 2. 3. Kedua -duanya boleh digunakan dalam kombinasi, seperti parameter lulus dalam fungsi pembalut; 4. Php8 menyokong parameter yang dinamakan yang sepadan apabila membongkar array bersekutu, dan perlu untuk memastikan nama kunci konsisten dengan nama parameter; 5. Beri perhatian untuk mengelakkan menggunakan pembongkaran untuk data yang tidak dapat diperoleh, mencegah kesilapan maut, dan perhatikan had kuantiti parameter. Ciri -ciri ini meningkatkan fleksibiliti kod dan kebolehbacaan, mengurangkan func_get_args () dan sebagainya

Memanfaatkan Argumen Dinamakan dan Promosi Harta Pembina dalam PHP Moden Memanfaatkan Argumen Dinamakan dan Promosi Harta Pembina dalam PHP Moden Jul 24, 2025 pm 10:28 PM

Php8.0'SnamedargumentsandConstructorPropertyPromotionImproveCodeCodeClarityAndreBeboilerPlate: 1.namedargumentsletyyoupassparametersbyname, enhancingabilityandallowingflexibleorder;

PHP Fungsi Anonymous vs Fungsi Arrow: Sintaks Deep Dive PHP Fungsi Anonymous vs Fungsi Arrow: Sintaks Deep Dive Jul 25, 2025 pm 04:55 PM

Fungsi anak panah sesuai untuk senario dengan ungkapan tunggal, panggilan balik mudah dan kebolehbacaan yang lebih baik; 2. Fungsi tanpa nama sesuai untuk senario dengan logik multi-line, aliran kawalan kompleks, merujuk pembolehubah luaran dan menggunakan penjana hasil; Oleh itu, anda harus memilih mengikut keperluan khusus: Senario mudah mengutamakan fungsi anak panah untuk meningkatkan kesederhanaan kod, sementara senario kompleks menggunakan fungsi tanpa nama untuk mendapatkan sokongan fungsional lengkap.

See all articles