PHP 8.4 akhirnya hadir, membawa perubahan menarik yang ditetapkan untuk mengubah cara pembangun bekerja! Dengan setiap versi baharu, PHP terus membuktikan mengapa ia merupakan alat yang sangat penting dalam landskap pembangunan web hari ini.
Artikel ini menganggap anda mempunyai pengetahuan asas tentang bahasa pengaturcaraan PHP.
Laravel Herd: digunakan untuk mengurus versi PHP dan pelayan Nginx saya.
PHPStorm: IDE hebat dengan IntelliSense dan copilot AI yang baik.
Laragon: Persekitaran pembangunan tempatan yang mudah digunakan yang menyokong PHP dan teknologi lain.
Dalam PHP, keterlihatan sifat objek secara tradisinya adalah simetri. Ini bermakna bahawa operasi dapatkan dan tetapkan untuk harta tanah mesti berkongsi keterlihatan yang sama—awam, peribadi atau dilindungi—tetapi tidak boleh berbeza.
Contohnya, jika harta benda adalah umum, kedua-dua membaca dan menulis kepadanya adalah umum, tanpa cara untuk membenarkan satu operasi tanpa yang lain.
Dalam konteks, apabila anda mengisytiharkan harta kelas awam, ia menjadi boleh ubah, membenarkannya dibaca dan diubah suai dari luar kelas.
Walau bagaimanapun, dengan kemunculan keterlihatan asimetri, anda kini boleh menentukan skop berasingan untuk sifat membaca dan menulis.
Ini bermakna harta boleh dibaca dalam satu konteks dan boleh ditulis dalam konteks lain, menawarkan kawalan yang lebih besar terhadap cara sifat diakses dan diubah suai.
class Animal{ public private(set) string $name; public setName(string $foo){ $ths->name = $foo; } } $animal = new Animal(); echo $animal->name; // This will run correctly
Kita boleh mempunyai harta yang didedahkan kepada umum dan harta yang ditetapkan dijadikan peribadi. Ini bermakna harta itu tidak boleh dikemas kini di luar kelas, menjadikannya tidak boleh diubah.
Jika anda cuba mengubah suai sifat $name, anda akan mendapat ralat yang menunjukkan anda tidak boleh mengubah suai harta tersebut kerana skop keterlihatan.
Berikut ialah beberapa perkara penting yang perlu diberi perhatian tentang keterlihatan tidak simetri:
Ruang tidak dibenarkan dalam pengisytiharan set-keterlihatan. private(set) betul. private( set ) tidak betul dan akan mengakibatkan ralat penghuraian.
Jika harta diisytiharkan sebagai awam, keterlihatan utama boleh ditinggalkan. Contohnya, peribadi awam(set) dan peribadi(set) akan berkelakuan sama, kerana keterlihatan awam tersirat.
Hanya sifat yang ditaip dibenarkan mempunyai keterlihatan berasingan untuk operasi yang ditetapkan. Ini bermakna anda tidak boleh menggunakan keterlihatan asimetri pada sifat yang tidak ditaip dalam PHP.
Keterlihatan yang ditetapkan mestilah sama atau lebih terhad daripada keterlihatan get. Contohnya, public protected(set) dan protected protected(set) adalah sah, tetapi protected public(set) akan mengakibatkan ralat sintaks.
Ketahui lebih lanjut tentang keterlihatan asimetri, termasuk contoh lain untuk tatapan anda.
Property hook ialah ciri hebat PHP 8.4 yang memperkenalkan cara untuk pembangun menambah mendapatkan dan menetapkan arahan terus kepada pembolehubah tanpa membuat kaedah secara ekspresif untuk membaca dan menulis kepada pembolehubah.
Sebagai alternatif, __get dan __set kaedah sihir boleh digunakan, tetapi ini menjadikan kod lebih verbose, boleh memperkenalkan ralat dan memecahkan alat analisis statik.
Adalah selamat untuk mengatakan reka bentuk dan sintaks cangkuk harta adalah serupa dengan Kotlin tetapi kebanyakannya dipengaruhi oleh bahasa pengaturcaraan C# dan Swift.
Dalam PHP 8.3, kita boleh mencipta kelas dengan sifat dalam pembinanya dan ia memberi kita keupayaan untuk membaca dan menulis pada harta itu.
class Animal{ public private(set) string $name; public setName(string $foo){ $ths->name = $foo; } } $animal = new Animal(); echo $animal->name; // This will run correctly
Masalah dengan pendekatan ini ialah apabila kami memutuskan untuk menulis kepada harta itu, kami sama ada menggunakan kaedah sihir __set atau secara ekspresif mencipta kaedah untuk memutasi pembolehubah, yang mungkin menyebabkan pecahnya pangkalan kod ke bawah baris.
Cangkok harta membolehkan pembangun membuat arahan yang ditetapkan dengan segera selepas membuat harta itu.
class Car { public function __construct(public string $model) { } }
Perhatikan bahawa nilai yang dihantar kepada arahan yang ditetapkan mestilah jenis yang sama dengan sifat, jika tidak, ralat akan dilemparkan.
Anda boleh menghantar jenis lain kepada arahan yang ditetapkan dan menukarnya kepada jenis yang betul sebelum menulis kepada harta, seperti yang dilihat di bawah:
class Car{ public string $model{ set (string $value) { if(strlen($value) === 0){ throw new ValueError("Model name cannot be empty"); } $this->model = $value; } } }
Contoh di atas menunjukkan cara kita boleh menerima pembolehubah jenis kompaun dengan selamat daripada arahan yang ditetapkan dan menghuraikannya kepada jenis yang betul yang ditakrifkan oleh harta itu.
Anda boleh meninggalkan hujah yang dihantar kepada arahan yang ditetapkan jika ia sama dengan jenis sifat. Contohnya, dua kaedah di bawah adalah sah dan berkelakuan serupa.
class Car{ public string $year{ set (string|number $value) { $year = intval($value); if($year < 2000){ throw new ValueError("We only accept cars produced in year 2000 and above"); } $this->year= $value; } } }
Perhatikan bahawa argumen lalai kepada $value jika ditinggalkan. Sintaks ini biasa dalam bahasa pengaturcaraan seperti Kotlin dan C#.
Sebelum ciri ini, mengakses ahli kelas dalam PHP melibatkan penambahan tanda kurungan tambahan di sekeliling kelas.
// --------------------------METHOD 1---------------------------- public string $model{ set (string $value) { if(strlen($value) === 0){ throw new ValueError("Model name cannot be empty"); } $this->model = $value; } } // --------------------------METHOD 2---------------------------- public string $model{ set { if(strlen($value) === 0){ throw new ValueError("Model name cannot be empty"); } $this->model = $value; } }
Jika anda tidak membungkus panggilan Kereta() baharu dalam kurungan, anda akan mendapat ralat penghuraian.
Sintaks baharu membolehkan kami mengakses kaedah, sifat dan pemalar tanpa memerlukan tanda kurung tambahan.
class Car { public function getName(){ return "Toyota Camry"; } } $carName = (new Car())->getName();
Untuk butiran penuh perubahan yang dicadangkan ini, lihat butiran dalam RFC.
Fungsi pembantu baharu akan datang ke PHP 8.4.
Sesetengah fungsi ini sudah mempunyai pelaksanaannya dalam Laravel Arr atau pembantu Koleksi.
Fungsi array_find_key()
Fungsi array_find_key($array, $callback) mengembalikan kunci elemen pertama yang kaedah $callback mengembalikan benar. Jika tiada unsur yang memenuhi syarat, fungsi mengembalikan null.
class Animal{ public private(set) string $name; public setName(string $foo){ $ths->name = $foo; } } $animal = new Animal(); echo $animal->name; // This will run correctly
Fungsi array_find()
Fungsi array_find_key() direka untuk mencari melalui tatasusunan dan mengembalikan kunci elemen pertama yang memenuhi syarat yang ditentukan oleh fungsi panggil balik.
Begitu juga dengan array_find_key(), ia mengembalikan null jika tiada unsur yang sepadan ditemui.
class Car { public function __construct(public string $model) { } }
Jika tiada buah dalam tatasusunan mempunyai kuantiti lebih daripada 10, fungsi itu akan mengembalikan nol.
Fungsi array_any()
Fungsi array_any() menentukan sama ada sekurang-kurangnya satu elemen dalam tatasusunan memenuhi kriteria tertentu yang ditentukan oleh fungsi penilaian yang disediakan.
Jika sekurang-kurangnya satu elemen memenuhi syarat, fungsi itu kembali benar; jika tidak, ia kembali palsu.
class Car{ public string $model{ set (string $value) { if(strlen($value) === 0){ throw new ValueError("Model name cannot be empty"); } $this->model = $value; } } }
Jika tiada nombor dalam tatasusunan yang lebih besar daripada 10, fungsi akan mengembalikan palsu.
Fungsi array_all()
Fungsi array_all() menyemak sama ada setiap item dalam tatasusunan melepasi ujian tertentu. Ia menggunakan peraturan khas (fungsi panggil balik) pada setiap item.
Jika semua item lulus ujian mengikut peraturan, maka array_all() kembali benar.
class Car{ public string $year{ set (string|number $value) { $year = intval($value); if($year < 2000){ throw new ValueError("We only accept cars produced in year 2000 and above"); } $this->year= $value; } } }
Dalam contoh ini, fungsi array_all() akan berulang melalui tatasusunan $numbers dan menggunakan fungsi panggil balik pada setiap elemen. Panggilan balik menyemak sama ada nombor itu boleh dibahagi dengan 2 (iaitu, genap).
Memandangkan semua nombor dalam tatasusunan genap, fungsi array_all() akan kembali benar dan mesej "Semua nombor genap." akan dipaparkan.
Kami telah meneliti peningkatan utama yang diperkenalkan dalam PHP 8.4. Kemas kini ini menawarkan peningkatan yang berharga untuk pembangun, termasuk ciri baharu yang berkuasa dan potensi keuntungan dalam kecekapan.
Untuk menyelami lebih mendalam semua kemas kini, termasuk contoh dan penjelasan terperinci, lawati halaman Pengumuman Keluaran PHP 8.4.0 rasmi.
Jangan lupa untuk menyemak penamatan dan perubahan keserasian ke belakang untuk memastikan peralihan yang lancar kepada versi terkini.
Jika anda menyukai artikel itu, jangan lupa kongsikannya dengan orang lain.
Saya ingin mendengar pendapat anda—lepaskan ulasan di bawah dan mari teruskan perbualan. Cheers! ?
Ikuti saya untuk lebih banyak artikel PHP, Node.js, TypeScript dan PHP! Anda juga boleh mencari saya di Twitter atau LinkedIn.
Atas ialah kandungan terperinci PHP : Ciri dan Penambahbaikan Teratas. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!