Mari analisa sebab generik tidak boleh digunakan dalam PHP

WBOY
Lepaskan: 2023-04-10 22:38:01
ke hadapan
5510 orang telah melayarinya

Artikel ini membawa anda pengetahuan yang berkaitan tentang PHP Terutamanya ia memperkenalkan sebab generik tidak boleh digunakan dalam PHP Seterusnya, kami akan menyelidiki situasi di sebalik generik dan PHP untuk memahami mengapa Jenis generik tidak disokong sebagai masih warganegara kelas pertama, harap ini membantu.

Mari analisa sebab generik tidak boleh digunakan dalam PHP

Pembelajaran yang disyorkan: "Tutorial PHP"

Mengapa kami tidak boleh menggunakan generik dalam PHP

Kami Kami akan mendalami perkara yang berlaku di sebalik generik dan PHP. Ia sangat menarik dan sangat penting untuk memahami sebab generik belum lagi disokong sebagai warga kelas pertama dalam PHP.

Mari analisa sebab generik tidak boleh digunakan dalam PHP

Jom tengok.

Tiada generik dalam PHP. Itulah kesimpulan untuk Nikita tahun lepas. Ini sememangnya tidak boleh dilaksanakan.

Untuk memahami sebab Nikita mengatakan perkara ini, kita perlu melihat cara generik dilaksanakan. Secara umumnya, terdapat tiga kemungkinan pendekatan yang menyokong generik kebanyakannya menggunakan salah satu daripada tiga pendekatan ini.

Yang pertama dipanggil generik monomorfik. Mari kita kembali ke artikel pertama siri ini, di mana saya menunjukkan contoh koleksi ini:

class StringCollection extends Collection
{
    public function offsetGet(mixed $key): string 
    { /* … */ }
}
class UserCollection extends Collection
{
    public function offsetGet(mixed $key): User 
    { /* … */ }
}
Salin selepas log masuk

Saya menjelaskan bahawa kita boleh membuat koleksi secara manual untuk setiap jenis koleksi yang kita perlukan pelaksanaan kelas. Beban kerja akan menjadi besar dan akan terdapat banyak kod, tetapi ia akan berfungsi.

Generik monomorfik melakukan perkara itu, tetapi secara automatik di belakang tabir. Pada masa jalanan, PHP tidak akan mengetahui tentang kelas Koleksi generik, sebaliknya mengenai dua atau lebih pelaksanaan khusus:

$users = new Collection<User>();
// Collection_User
$slugs = new Collection<string>();
// Collection_string
Salin selepas log masuk

Generik monomorfik ialah pendekatan yang sah dengan sempurna. Sebagai contoh, Rust menggunakannya. Satu kelebihan ini ialah terdapat satu siri peningkatan prestasi, kerana tiada lagi semakan jenis generik pada masa jalan, jadi semakan ini diasingkan sebelum menjalankan kod.

Tetapi ini segera membawa kita kepada masalah generik monomorfik dalam PHP. PHP tidak mempunyai langkah penyusunan eksplisit yang memisahkan kelas generik kepada beberapa pelaksanaan konkrit seperti yang dilakukan oleh Rust ialah: generik monomorfik memerlukan sedikit memori kerana anda membuat beberapa salinan kelas yang sama, tetapi Terdapat; adalah beberapa perbezaan. Ini mungkin bukan masalah besar untuk binari Rust yang disusun, tetapi ia adalah masalah serius untuk kod PHP yang berjalan dari titik pusat (pelayan) yang berpotensi mengendalikan ratusan atau ribuan permintaan sesaat .

Pilihan seterusnya ialah memperkukuh semula generik. Ini ialah pelaksanaan di mana kelas generik kekal seperti sedia ada dan maklumat jenis dinilai secara dinamik semasa masa jalan. C# dan Kotlin melaksanakan generik, yang paling hampir dengan sistem jenis semasa PHP, memandangkan PHP melakukan semua pemeriksaan jenis pada masa jalan. Masalahnya di sini ialah ia memerlukan banyak pemfaktoran semula kod teras untuk menjadikan generik terwujud berfungsi, dan anda boleh bayangkan bahawa semasa kami melakukan lebih banyak pemeriksaan jenis pada masa jalanan, beberapa overhed prestasi akan meningkat.

Ini membawa kita kepada pilihan terakhir: abaikan generik sepenuhnya semasa masa jalan. Ia seperti mereka tidak ada di sana, pelaksanaan generik kelas koleksi, sebagai contoh, boleh mengendalikan semua jenis input.

Jadi jika kita mengabaikan semua semakan jenis generik pada masa jalan, tidak akan ada masalah.

Nah, tidak begitu pantas. Mengabaikan jenis generik semasa runtime - ia dipanggil pemadaman jenis, dengan cara, dan Java dan Python melakukan ini - menyebabkan beberapa masalah untuk PHP.

Contoh: PHP bukan sahaja menggunakan jenis untuk pengesahan, ia juga menggunakan maklumat jenis untuk menukar nilai secara dinamik daripada satu jenis kepada jenis yang lain - inilah yang saya nyatakan dalam artikel pertama siri ini Jenis Juggle:

function add(int $a, int $b): int 
{
    return $a + $b;
}
add(&#39;1&#39;, &#39;2&#39;) // 3;
Salin selepas log masuk

Jika PHP mengabaikan jenis generik koleksi "rentetan" ini dan kami secara tidak sengaja menambah integer padanya, maka jika jenis generik dialih keluar, ia tidak akan Dapat Memberi Amaran kepada Kami:

$slugs = new Collection<string>();
$slugs[] = 1; // 1 不会被转换为 &#39;1&#39;
Salin selepas log masuk

Masalah kedua dan lebih penting dengan pemadaman jenis - dan mungkin anda telah menjerit pada skrin anda sekarang - ialah jenis itu hilang. Jika jenis generik dialih keluar semasa masa jalan, mengapa kami menambahnya?

Ini masuk akal dalam Java dan Pyton kerana semua definisi jenis disemak sebelum menjalankan kod dengan penganalisis statik. Java, sebagai contoh, menjalankan penganalisis statik terbina dalam apabila menyusun kod anda sesuatu yang PHP tidak lakukan sama sekali: tiada langkah penyusunan, dan sudah tentu tiada penyemak jenis statik terbina dalam.

Sebaliknya... semua kelebihan semakan jenis, yang kita bincangkan dalam artikel sebelum ini, ia tidak datang dari penyemak jenis runtime terbina dalam PHP. Kami sudah menjalankan kod apabila penyemak jenis PHP memberitahu kami terdapat masalah. Ralat jenis pada dasarnya merosakkan program kami.

Sebaliknya, kebanyakan nilai tambah semakan jenis datang daripada penganalisis statik yang tidak memerlukan kami menjalankan kod tersebut. Selagi pengaturcara menyediakan maklumat jenis yang mencukupi, mereka mempunyai peluang yang baik untuk memastikan bahawa ralat jenis masa jalan tidak akan berlaku. Ini tidak bermakna anda tidak boleh mempunyai sebarang ralat dalam kod anda, tetapi adalah mungkin untuk menulis kod PHP yang disemak sepenuhnya secara statik dan tidak menghasilkan sebarang jenis ralat semasa runtime. Intinya: kami memperoleh semua cerapan statik semasa menulis kod; ini adalah bahagian paling berharga dari mana-mana jenis sistem, bebas daripada semakan jenis masa jalan.

Jadi adakah kita benar-benar memerlukan semakan jenis masa jalan? Kerana inilah sebab utama mengapa anda tidak boleh menambah generik dalam PHP pada masa ini: mengesahkan jenis generik pada masa jalan adalah terlalu kompleks atau terlalu intensif sumber untuk PHP.

Alamat asal: https://stitcher.io/blog/generics-in-php-3

Alamat terjemahan: https://learnku.com/php/t/ 66486

Pembelajaran yang disyorkan: "Tutorial Video PHP"

Atas ialah kandungan terperinci Mari analisa sebab generik tidak boleh digunakan dalam PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
php
sumber:learnku.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