


Statik vs Diri: Membongkar pengikatan statik lewat di PHP
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.
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
vsstatic::CONST
masih merujuk kepada kelas di mana ia ditakrifkan). - Berhati -hati apabila menggunakan
static
dalam kelas akhir - tidak ada warisan, jadiself
danstatic
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!

Alat AI Hot

Undress AI Tool
Gambar buka pakaian secara percuma

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io
Penyingkiran pakaian AI

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

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

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

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.

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

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

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

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

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

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.
