Jadual Kandungan
Deeper Generics
Rumah pembangunan bahagian belakang tutorial php Ketahui lebih lanjut tentang generik dalam PHP dengan contoh

Ketahui lebih lanjut tentang generik dalam PHP dengan contoh

Apr 12, 2022 am 11:12 AM
php Generik

Artikel ini akan memberi anda pemahaman yang mendalam tentang generik dalam PHP dan memperkenalkan dua contoh generik saya harap ia akan membantu anda!

Ketahui lebih lanjut tentang generik dalam PHP dengan contoh

Deeper Generics

Saya menunjukkan generik yang sangat membosankan dalam artikel terdahulu saya Contoh, kita akan lakukan lebih baik dalam yang ini.

$users = new Collection<User>();

$slugs = new Collection<string>();
Salin selepas log masuk

Mereka mungkin cara paling mudah untuk menerangkan generik, tetapi mereka juga merupakan contoh yang dibincangkan oleh semua orang semasa membincangkan generik. Orang sering menganggap "generik" dan "koleksi bertaip" sebagai perkara yang sama. Sama sekali tidak begitu. 集合

Jadi mari kita lihat dua lagi contoh.

Ketahui lebih lanjut tentang generik dalam PHP dengan contoh

Ini ialah fungsi yang dipanggil "apl" - jika anda menggunakan rangka kerja seperti Laravel, ia mungkin kelihatan biasa: fungsi ini menerima nama kelas, Dan gunakan bekas bergantung untuk selesaikan contoh kelas itu:

function app(string $className): mixed
{
    return Container::get($className);
}
Salin selepas log masuk
Sekarang, anda tidak perlu tahu cara bekas itu berfungsi, yang penting fungsi ini akan memberi anda contoh kelas yang anda minta.

Jadi, pada asasnya, ia adalah fungsi generik; jenis pulangan bergantung pada nama kelas yang anda berikan. Alangkah baiknya jika IDE kami dan penganalisis statik lain juga memahami bahawa jika saya memberikan fungsi ini nama kelas "UserRepository", saya mahukan contoh UserRepository dikembalikan dan tidak ada yang lain:

function app(string $className): mixed
{ /* … */ }

app(UserRepository::class); // ?
Salin selepas log masuk
Nah, generik membenarkan kita untuk berbuat demikian.

Saya fikir sekarang adalah masa yang baik untuk menyatakan bahawa saya telah menyimpan rahsia, seperti: Saya telah menyebut dalam catatan saya sebelum ini bahawa generik tidak wujud dalam PHP, itu tidak sepenuhnya benar. Semua penganalisis statik di luar sana - alat yang membaca kod tanpa menjalankannya, alat seperti IDE anda - mereka membenarkan penggunaan komen blok dokumen untuk generik:

/**
 * @template Type
 * @param class-string<Type> $className
 * @return Type
 */
function app(string $className): mixed
{ /* … */ }
Salin selepas log masuk
Diakui: Ini bukan sintaks yang paling sempurna, semua penganalisis statik bergantung pada protokol mudah, iaitu tiada sintaks kanonik rasmi bagaimanapun: ia berfungsi. Tiga daripada penganalisis statik terbesar di dunia PHP: PhpStorm, Psalm dan PhpStan, semuanya memahami sintaks ini sedikit sebanyak.

IDE seperti PhpStorm menggunakannya untuk memberikan maklum balas kepada pengaturcara semasa mereka menulis kod, manakala alatan seperti Psalm dan PhpStan menggunakannya untuk menganalisis secara pukal asas kod anda dan mengesan potensi pepijat, Terutamanya berdasarkan definisi jenis.

Jadi sebenarnya, kita boleh membina fungsi

ini supaya alat kita tidak lagi berjalan dalam gelap. Sudah tentu, PHP sendiri tidak dapat menjamin bahawa jenis pulangan adalah betul, kerana PHP tidak akan menaip semak fungsi semasa runtime bagaimanapun, jika kita boleh mempercayai bahawa penganalisis statik kami adalah betul, maka apabila menjalankannya, perenggan ini Terdapat kod yang sangat sedikit; - tiada peluang gangguan. app

Ini adalah kuasa analisis statik yang luar biasa: kami sebenarnya boleh memastikan, tanpa menjalankan kod kami bahawa kebanyakannya akan berfungsi seperti yang diharapkan. Semua ini boleh dilakukan terima kasih kepada jenis - termasuk generik.

Mari kita lihat contoh yang lebih kompleks:

Attributes::in(MyController::class)
    ->filter(RouteAttribute::class)
    ->newInstance()
    ->
Salin selepas log masuk
Di sini kita mempunyai kelas yang boleh "mempertanyakan" sifat dan membuat seketika mereka. Saya dapati kelas pembantu ini sangat berguna jika anda telah menggunakan sifat sebelum mengetahui bahawa API pantulan mereka agak bertele-tele.

Apabila kami menggunakan kaedah

, kami memberikannya nama kelas untuk sifat itu; kemudian memanggil kaedah filter, kami tahu bahawa hasilnya akan menjadi contoh kelas penapis kami. Sekali lagi: adalah bagus jika IDE kami memahami perkara yang kami bincangkan. newInstance

Anda telah menekanya: Generik membenarkan kami melakukan ini:

/** @template AttributeType */
class Attributes
{
    /**
     * @template InputType
     * @param class-string<InputType> $className
     * @return self<InputType>
     */
    public function filter(string $className): self
    { /* … */ }

    /**
     * @return AttributeType 
     */   
    public function newInstance(): mixed
    { /* … */ }

    // …
}
Salin selepas log masuk
Saya harap anda mula melihat kuasa maklumat jenis mudah. Beberapa tahun yang lalu saya memerlukan pemalam IDE untuk membuat cerapan ini berfungsi, kini saya hanya perlu menambah beberapa jenis maklumat.

Walau bagaimanapun, contoh terbaharu ini tidak hanya bergantung pada generik, terdapat satu lagi bahagian yang sama pentingnya. Jenis inferens: Keupayaan penganalisis statik untuk "meneka" - atau menentukan dengan pasti - jenis tanpa pengguna menyatakannya. Itulah yang berlaku dengan anotasi seperti rentetan di sana. IDE kami dapat mengenali input yang kami sediakan untuk fungsi ini sebagai nama kelas dan membuat kesimpulan jenis sebagai jenis generik.

Jadi, semuanya telah diselesaikan, betul: Terdapat generik dalam PHP dan semua penganalisis statik utama tahu cara menggunakannya. Nah...ada beberapa kaveat.

Pertama sekali, tiada spesifikasi rasmi tentang rupa generik, kini setiap penganalisis statik boleh menggunakan sintaks mereka sendiri pada masa ini, mereka telah bersetuju dengan salah satu daripadanya; .

Kedua: Sekatan dokumen adalah sub-optimum pada pendapat saya. Mereka berasa kurang penting dalam asas kod kami. Sudah tentu, anotasi generik hanya memberikan cerapan statik dan tiada fungsi masa jalan, tetapi kami telah melihat kuasa analisis statik walaupun tanpa pemeriksaan jenis masa jalan. Saya fikir adalah tidak adil untuk menganggap maklumat jenis sebagai "komen dokumentasi", ia tidak menyampaikan kepentingan jenis ini dalam kod kami. Itulah sebabnya kami mendapat atribut dalam PHP8: semua kefungsian yang disediakan oleh atribut, adalah mungkin dalam ulasan docblock, tetapi ia tidak cukup baik. Perkara yang sama berlaku untuk generik.

Nota akhir: tanpa spesifikasi yang betul, ketiga-tiga penganalisis statik utama mempunyai perbezaan antara pelaksanaan generiknya. PhpStorm adalah yang paling kurang pada masa ini. Sebaik-baiknya, akan ada spesifikasi rasmi dari dalam PHP. Tetapi belum ada yang rasmi lagi.

Ini ialah sebab utama mengapa saya fikir ia berbaloi untuk melaburkan masa dalam penyelesaian yang lebih tahan lama dan lebih mampan. Jadi mengapa PHP belum mempunyai generik yang betul? Mengapa kita bergantung pada bahagian dokumentasi tanpa spesifikasi yang jelas?

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

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

Disyorkan: "Tutorial Video PHP"

Atas ialah kandungan terperinci Ketahui lebih lanjut tentang generik dalam PHP dengan contoh. 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

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.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
4 minggu 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)

Panduan Pemasangan dan Naik Taraf PHP 8.4 untuk Ubuntu dan Debian Panduan Pemasangan dan Naik Taraf PHP 8.4 untuk Ubuntu dan Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 membawa beberapa ciri baharu, peningkatan keselamatan dan peningkatan prestasi dengan jumlah penamatan dan penyingkiran ciri yang sihat. Panduan ini menerangkan cara memasang PHP 8.4 atau naik taraf kepada PHP 8.4 pada Ubuntu, Debian, atau terbitan mereka

Tarikh dan Masa CakePHP Tarikh dan Masa CakePHP Sep 10, 2024 pm 05:27 PM

Untuk bekerja dengan tarikh dan masa dalam cakephp4, kami akan menggunakan kelas FrozenTime yang tersedia.

Bincangkan CakePHP Bincangkan CakePHP Sep 10, 2024 pm 05:28 PM

CakePHP ialah rangka kerja sumber terbuka untuk PHP. Ia bertujuan untuk menjadikan pembangunan, penggunaan dan penyelenggaraan aplikasi lebih mudah. CakePHP adalah berdasarkan seni bina seperti MVC yang berkuasa dan mudah difahami. Model, Pandangan dan Pengawal gu

Muat naik Fail CakePHP Muat naik Fail CakePHP Sep 10, 2024 pm 05:27 PM

Untuk mengusahakan muat naik fail, kami akan menggunakan pembantu borang. Di sini, adalah contoh untuk muat naik fail.

Pengesah Mencipta CakePHP Pengesah Mencipta CakePHP Sep 10, 2024 pm 05:26 PM

Pengesah boleh dibuat dengan menambah dua baris berikut dalam pengawal.

Cara Menyediakan Kod Visual Studio (Kod VS) untuk Pembangunan PHP Cara Menyediakan Kod Visual Studio (Kod VS) untuk Pembangunan PHP Dec 20, 2024 am 11:31 AM

Kod Visual Studio, juga dikenali sebagai Kod VS, ialah editor kod sumber percuma — atau persekitaran pembangunan bersepadu (IDE) — tersedia untuk semua sistem pengendalian utama. Dengan koleksi sambungan yang besar untuk banyak bahasa pengaturcaraan, Kod VS boleh menjadi c

Panduan Ringkas CakePHP Panduan Ringkas CakePHP Sep 10, 2024 pm 05:27 PM

CakePHP ialah rangka kerja MVC sumber terbuka. Ia menjadikan pembangunan, penggunaan dan penyelenggaraan aplikasi lebih mudah. CakePHP mempunyai beberapa perpustakaan untuk mengurangkan beban tugas yang paling biasa.

Bagaimana anda menghuraikan dan memproses HTML/XML dalam PHP? Bagaimana anda menghuraikan dan memproses HTML/XML dalam PHP? Feb 07, 2025 am 11:57 AM

Tutorial ini menunjukkan cara memproses dokumen XML dengan cekap menggunakan PHP. XML (bahasa markup extensible) adalah bahasa markup berasaskan teks yang serba boleh yang direka untuk pembacaan manusia dan parsing mesin. Ia biasanya digunakan untuk penyimpanan data

See all articles