Apa yang baru di PHP 8: Semua yang perlu Anda ketahui!

Diterbitkan: 2021-01-06

Kami akan menghubungi PHP8 pada 26 November 2020 , dan tentu saja, ada banyak tulisan tentang fitur-fitur yang akan datang dalam rilis yang dihargai ini.

PHP 8

Karena ini adalah versi utama, akan ada beberapa perubahan dan fitur baru serta menjadikannya penting untuk mengetahui apa saja yang berubah. Ini akan membuatnya nyaman untuk memikirkan bagaimana PHP8 akan mempengaruhi aplikasi Anda dan tindakan apa yang perlu diambil untuk memastikan Anda dapat meningkatkan dengan nyaman tanpa insiden.

Kami melewati beberapa perubahan yang paling signifikan untuk mengetahui apa yang akan kami dapatkan di rilis PHP berikutnya dan apa yang layak dikritik.

mari kita mulai dengan ikhtisar!

Ikhtisar PHP 8

Seperti disebutkan di atas, PHP 8 memperkenalkan paket fitur baru, peningkatan, fungsi, dan penghentian bahasa. Di antara semua ini, fitur yang paling banyak dibahas adalah kompiler JIT. Namun, fitur peningkatan kinerja seperti JIT layak menjadi pusat perhatian, tetapi peningkatan sintaksis diharapkan memiliki lebih banyak kesuksesan nyata bagi praktisi PHP, kami akan mengatakan, "setidaknya dalam jangka pendek."

Sebuah sejarah perubahan

Beberapa perubahan PHP diusulkan, diperdebatkan, diimplementasikan, dan selanjutnya disetujui dalam waktu singkat. Mereka populer, tidak kontroversial, dan memiliki metode alami untuk menerapkannya.

Dan setelah itu datang yang dicoba, gagal, dan kembali berkali-kali sebelum akhirnya kita terima. Beberapa kali implementasinya memakan waktu lama untuk diselesaikan, dan terkadang ide itu sendiri setengah matang, dan terkadang komunitas itu sendiri belum menghangat dengan ide—”belum waktunya.”

Kredit jatuh tepat ke dalam kategori jenis. Mereka pertama kali diusulkan pada tahun 2016 untuk PHP 7.1. Namun, mereka bertemu dengan perlawanan keras kepala dan kehilangan suara penerimaan dengan selisih yang besar. Sekarang, maju cepat empat tahun, dan proposal yang sangat mirip jika lingkupnya sedikit dikurangi melayang hanya dengan satu pembangkang. Ini jelas merupakan ide yang waktunya telah tiba!

Apa masalah dengan kode lama?

SEBAGAI PHP 8 adalah rilis baru yang sangat besar, kita harus mengharapkan kode lama tidak lagi kompatibel. Namun, sebagian besar perubahan yang dapat menimbulkan komplikasi sudah disampaikan dalam versi 7.2 , 7.3 , dan 7.4 . Mari kita bicara tentang perubahan terakhir sekarang. Mereka adalah:

Warisan kutipan ajaib

  • Tipe sebenarnya
  • FILTER_SANITIZE_MAGIC_QUOTES filter
  • Lepas $this dari penutupan non-statis
  • array_key_exists() dengan objek
  • mb_strrpos() dengan pengkodean sebagai argumen ke-3
  • Metode ekspor refleksi ()
  • fungsi convert_cyr_string()
  • campuran urutan parameter implode()
  • restore_include_path() fungsi
  • fungsi hebrevc()
  • uang_format() fungsi
  • allow_url_include direktif ini
  • ezmlm_hash() fungsi

Fungsi Baru di PHP 8

str_contains

Jika satu string berisi string lain, maka ada banyak cara untuk mengetahuinya.

Umumnya, Anda akan menggunakan strpos(). Seperti yang Anda ketahui, strpos() mengambil tumpukan jerami di samping jarum yang ingin Anda cari. Ini mengembalikan bilangan bulat yang menunjukkan posisi pertama di mana Anda melihat jarum.

Sekarang, karena mengembalikan posisi string di yang lain, Anda tidak dapat memeriksa apakah strpos() menemukannya atau tidak; jika mengembalikan "0" (posisi diindeks nol dan dimulai dengan 0 daripada 1), maka kondisional akan memperlakukannya sebagai nilai salah, dan menunjukkan itu tidak ditemukan.

Apa artinya?

Anda harus menulis conditional –“strpos($haystack, $needle) !== false.” False menunjukkan bahwa ia tidak dapat menemukan posisi string. Ini adalah metode non-transparan dan esoterik untuk mencari string dalam string! Yah, tidak begitu membingungkan.

Untuk menghindari ini, PHP 8 membawa str_contains(). Tugas str_contains() adalah mengembalikan boolean sederhana yang menunjukkan apakah jarum ada di tumpukan jerami atau tidak. Itu jauh lebih mudah untuk ditulis, selain itu, mengerti sebagai seseorang yang memelihara kode, bukan?

 if (str_contains( 'Foo Bar Baz' , 'Foo' )) { // FOUND }

PHP 8: Fitur & Perubahan Mesin

Ada beberapa fitur mesin baru, dan perubahan terlihat di PHP 8. Fitur utama, tidak diragukan lagi, adalah kompiler JIT baru.

Kompiler JIT

  • Penegakan LSP
  • Kesalahan fatal pada tanda tangan metode yang tidak kompatibel
  • Sumber daya "Kelas"
  • XML-RPC sekarang di PECL
  • Perilaku penegasan
  • Perubahan refleksi

Demi tujuan inti blog ini, kami akan fokus pada kompiler JIT, "kelas" sumber daya, dan akhirnya, perubahan API refleksi.

Kompilator Tepat Waktu ( RFC )

Karena peningkatan kecepatan yang dilakukan sebelum rilis PHP7, lahirlah kompiler Just-In-Time (atau JIT). Ini diperkenalkan ke PHP8 karena hampir tidak ada peningkatan kecepatan yang dapat dilakukan tanpa menggunakan JIT. Idenya adalah bahwa itu akan meningkatkan kinerja PHP.

Kode PHP diterjemahkan ke dalam bytecode ketika dieksekusi, dan bytecode tersebut selanjutnya digunakan untuk menjalankan langkah-langkah dalam program.

PHP akan menganalisis kode yang Anda jalankan, itulah arti JIT. Lebih jauh, itu dapat membuat keputusan waktu nyata selain peningkatan kinerja pada kode saat Anda menjalankannya. Ini akan sangat berguna dalam aplikasi intensif CPU dan tidak hanya saat digunakan dalam skenario berbasis web.

Itu mencerminkan aplikasi PHP sisi server tentu bisa lebih lazim dengan sistem JIT bawaan PHP.

Anda harus mengaktifkan JIT terlebih dahulu jika ingin menggunakannya. Pada sistem pengujian kami (Ubuntu 20.04), kami telah menginstal modul opcache PHP, yang kami instal dengan paket inti PHP8. Kami telah mengkonfigurasi dalam file yang ditempatkan di /etc/php/8.0/cli/conf.d/10-opcache.ini.

Sekarang, Anda sudah siap untuk mengaktifkan JIT, bukan?  

  • Aktifkan opcache

Anda dapat menetapkan penyimpanan memori ke pengaturan opcache.jit_buffer_size . File Anda akan muncul seperti ini di sistem saya.

  1. zend_extension=opcache.so
  2. opcache.enable_cli=1
  3. ; konfigurasi untuk modul opcache php
  4. opcache.jit_buffer_size=256M

Selanjutnya gunakan fungsi opcache_get_status() untuk memastikan apakah aktif. Arahkan pandangan Anda ke bagian 'jit' dari array ini dan dapatkan info tentang status JIT saat ini.


var_dump(opcache_get_status()['jit']);

Jika JIT telah diaktifkan dengan sempurna, ini akan tercetak seperti yang ditunjukkan di bawah ini.

  1. larik(7) {
  2. [“diaktifkan”]=>
  3. bool (benar)
  4. [“aktif”]=>
  5. bool (benar)
  6. [“baik”]=>
  7. int(5)
  8. [“tingkat_opt”]=>
  9. int(4)
  10. [“opt_flags”]=>
  11. int(6)
  12. [“buffer_size”]=>
  13. int(268435440)
  14. [“bebas_buffer”]=>
  15. int(268432880)
  16. }

Jadi apakah itu lebih cepat? Singkatnya, kami akan berseru "ya" yang hangat.

Kami telah melihat beberapa orang melakukan benchmark dengan bantuan set mandelbrot, jadi kami memutuskan untuk menggunakan perpustakaan yang kami buat beberapa waktu lalu yang menggambar beberapa jenis fraktal yang berbeda di PHP. Yang kami lakukan hanyalah menghasilkan tiga fraktal dan melacak berapa lama waktu yang dibutuhkan untuk memanfaatkan fungsi microtome(). Kami telah menampilkan hasil untuk PHP 7.4.8 di bawah ini.

  • Pembakaran – 84.20269203186
  • Mandlebrot – 21.552599906921
  • Tricorn – 32.685042858124

Ketika kami menjalankan kode yang sama di PHP8, itu cukup cepat. Angka-angka akan berbicara sendiri. .

  • Pembakaran – 15.272277116776
  • Mandlebrot -3.7528541088104
  • Tricorn -4.4957919120789

Peningkatan kecepatan yang sangat besar ini cukup menarik. Kode yang kami gunakan di sini membuat fraktal berukuran besar, tetapi kami ingat saat membuat kode bahwa sebagian besar waktu kami dihabiskan untuk menunggu pembuatan fraktal.

Penambahan ini menarik bagi kami karena kami telah mendorong PHP ke batasnya pada beberapa kesempatan (di luar menghasilkan fraktal). Kami dapat melihat bahwa ini sangat bermanfaat bagi masa depan PHP dan akan memungkinkan bahasa dipilih untuk situasi di luar bahasa situs web biasa.

Kami belum melihat peningkatan kecepatan untuk aplikasi seperti WordPress atau Drupal, tetapi dari apa yang telah kami baca, tentu ada sedikit perbedaan dalam aplikasi semacam itu. Di masa mendatang, kami akan menjalankan benchmark pada platform ini untuk mencari tahu perbedaan seperti apa yang ditandai oleh JIT di sana.

Jenis Serikat ( RFC )

Sejak PHP7, menetapkan jenis nilai pengembalian dan jenis argumen dan telah dimungkinkan. Ini akan memungkinkan PHP untuk membuat kesalahan jika jenis argumen yang Anda berikan adalah jenis yang tidak identik dengan jenis yang diharapkan. Sangat penting untuk memastikan bahwa fungsi menerima serta menghasilkan jenis nilai yang sempurna dalam bahasa yang diketik secara longgar seperti PHP.

Di PHP8, sekarang dimungkinkan untuk menetapkan berbagai macam argumen dan mengembalikan nilai, dipisah dengan karakter pipa.

Kami telah menunjukkan di bawah fungsi yang mampu menerima nilai float atau integer.

 function addNumbers(int|float $number1, int|float $number2) : int|float { return $number1 + $number2; }

Sebelumnya, fungsi yang identik dengan ini perlu dibuat tanpa petunjuk tipe apa pun karena PHP dapat secara diam-diam menampilkan tipe jika argumen yang diteruskan tidak benar. Artinya, jika kita menetapkan tipe argumen sebagai bilangan bulat, PHP akan menampilkan nilai float apa pun ke dalam bilangan bulat. Ini tentu saja dapat menyebabkan beberapa bug rumit untuk ditangkap jika Anda tidak melakukan pengujian unit.

Kami hanya menyebutnya seperti yang lain untuk menggunakan fungsi di atas

 echo addNumbers(1, 1); // prints 2 echo addNumbers(1.1, 1.1); // prints 2.2

Jika kami mencoba meneruskan string ke fungsi yang identik:

 echo addNumbers('one', 'two');

Kami akan menerima kesalahan PHP Fatal yang menyatakan bahwa kami harus memasukkan float atau "int" ke dalam fungsi.

Anda tidak dapat menggunakan tipe void sebagai tipe gabungan karena menetapkan bahwa fungsi tidak akan mengembalikan apa pun. Dengan kata sederhana, Anda tidak dapat menyatakan bahwa suatu fungsi akan mengembalikan void atau integer; Anda akan menerima kesalahan fatal PHP.

Sementara perubahan normal yang dapat kita lihat adalah fitur ini digunakan sedikit karena sebelumnya hanya dimungkinkan untuk menetapkan berbagai jenis nilai dalam komentar, yang mengakibatkan komentar blok doc menjadi lebih detail daripada kode.

Operator Nullsafe (RFC)

Selain operator penggabungan nol, kemampuan untuk mendeteksi nilai pengembalian nol dimungkinkan langsung dari metode. Jika Anda tidak mengetahuinya, operator penggabungan nol memungkinkan Anda mendapatkan nilai, dan Anda tidak perlu menguji jika nilainya ada selain mengembalikan nilai yang berbeda jika nilai pertama adalah nol.

Jadi, kita bisa melakukan ini untuk mengambil nilai dari – “$_GET superglobal.” dan jika nilai itu tidak ada, maka "0."


1. $page = $_GET['page'] ?? 0;

2. echo $halaman;

Cara kerja operator aman nol adalah sama tetapi memungkinkan Anda membuat pintasan praktis dan menguji pengembalian nol dari suatu cara sebelum mencoba menggunakan nilai itu.

Kami melihat bahwa ini pada akhirnya akan berguna di Drupal, di mana kami cenderung menulis banyak kode pemeriksaan untuk memastikan bahwa "pengembalian dari metode" atau "properti objek" memiliki sesuatu di dalamnya sebelum menggunakannya. Ini wajib karena keadaan kontekstual objek di Drupal karena konten yang dikandungnya. Perubahan ini pasti akan menyederhanakan beberapa pemeriksaan.

Argumen Bernama ( RFC )

Argumen bernama memungkinkan Anda untuk menetapkan urutan argumen dan fungsi panggilan yang berbeda. Ambil fungsi normal berikut yang memiliki dua parameter. Itu mengisi array dengan panjang yang diberikan.

 function fillArray(array $arrayToFill, int $number) : array { for ($i = 0 $i < $number; ++$i) { $arrayToFill[$i] =1; } return $arrayToFill; }

Kita dapat melewati argumen dalam pengaturan yang mereka definisikan dapat memanggil teknik ini dengan cara biasa.

 $newArray = fillArray([], 2);

Pada PHP8 sekarang Anda dapat memberi nama parameter saat Anda meneruskannya ke fungsi. Ini juga memungkinkan Anda untuk mengirim parameter dalam urutan apa pun yang kami inginkan.

 $newArray = fillArray(number: 2, arrayToFill: []);

Contoh normal, tetapi dapat membuat kode lebih mudah dibaca juga.

Teknik ini bekerja dengan semua fungsi di PHP, bukan hanya yang ditentukan pengguna. Dalam bahasa PHP, fungsi array dan string memiliki urutan parameter yang tidak identik. Jadi, ini benar-benar tambahan yang disambut baik.

Atribut V2 ( RFC1 RFC2 RFC3 )

Atribut menyediakan mekanisme untuk menggabungkan metadata ke kelas PHP, fungsi, properti kelas, parameter fungsi, dan konstanta. Mereka tidak dapat diakses secara langsung melalui kode, dan Anda perlu menariknya keluar dengan bantuan kelas refleksi bawaan PHP.

Kelas ReflectionClass telah ada di PHP sejak PHP5; namun, metode getAttribute() baru untuk PHP8. Metode ini mengembalikan berbagai objek ReflectionAttribute yang akan mencakup informasi tentang atribut.

Penambahan ini menghadapi beberapa perubahan (seperti yang dapat kita lihat dari beberapa RFC di atas). Jika Anda membuat instance kelas, Anda kemudian dapat menggunakan ReflectionClass dan mencetak info atribut yang terdapat pada tingkat kelas. Ada cukup banyak atribut di PHP8, jadi kami sarankan untuk membaca RFC dan membiasakan diri dengan apa yang sebenarnya dan bagaimana Anda dapat mengintegrasikannya ke dalam kode Anda.

Ekspresi kecocokan ( RFC )

Di PHP 8, kita dapat membandingkan ekspresi kecocokan baru dengan pernyataan sakelar steno.

Tampaknya sedikit seperti deklarasi fungsi yang akan mengembalikan nilai berdasarkan nilai yang diteruskan.

Pernyataan switch di PHP luar biasa ketika Anda ingin memeriksa kondisi pada ekspresi yang sama tanpa menyertakan banyak pernyataan if secara bersamaan.

Di sini kami membawa perbandingan if-else dasar pada ekspresi yang identik.

 <?php if ($i == 'apple') { echo 'i is apple'; } elseif ($i == 'cake') { echo 'i is cake'; } else { echo 'i is pizza'; }

Dan ini adalah bagaimana pernyataan switch yang setara dari contoh kita sebelumnya akan muncul seperti

 <?php switch ($i) { case 'apple': echo 'i is apple'; break; case 'cake': echo 'i is cake'; break; default: echo 'i is pizza'; }

Sumber daya "Kelas"

“Kelas” sumber daya masuk dalam daftar perubahan besar dalam PHP 8 dan berfungsi sebagai pengganti yang tidak dapat dibuat-buat untuk jenis sumber daya yang diberikan. Lihat di bawah untuk mengetahui pengganti yang tersedia meliputi:

  • CurlHandle — curl_init() sekarang mengembalikan CurlHandle, menghubungkan sumber daya curl.
  • Socket / AddressInfo — Diberikan oleh ekstensi sockets; jumlah fungsi socket_*() mengembalikan Socket, sedangkan fungsi socket_address_info_lookup() mengembalikan instance AddressInfo.
  • GdImage — Ini mewakili sumber daya GD, seperti yang dipulihkan oleh banyak fungsi imagecreatefrom*().

Juga, penting untuk dicatat bahwa sumber daya tidak dihancurkan oleh fungsi seperti curl_close(). Sebaliknya, Anda harus menghapus () instance untuk menghilangkan referensi karena sekarang menjadi instance kelas.
Anda mendapatkan kemampuan untuk menentukan kelas sebagai typehints dalam fungsi dan metode Anda.
Sebelumnya, kami harus mengembalikan nilai yang tidak diketik atau meninggalkan argumen sumber daya dan mendokumentasikannya melalui anotasi, tetapi sekarang, Anda dapat memiliki tipe eksplisit, dan itu tidak hanya membuat kode Anda lebih mudah dibaca tetapi juga lebih aman untuk mengetik.
Apa trade-off di sini?
Anda sekarang harus memperbarui kode Anda jika Anda ingin menghancurkan sumber daya dengan bantuan unset() menggantikan fungsi sebelumnya yang digunakan untuk menghancurkan sumber daya. Ini biasanya dapat dicapai melalui pencarian dan penggantian.

Perubahan API Refleksi

Satu lagi, tetapi perubahan penting dalam PHP 8 terkait dengan Reflection API. Saat menggunakan sistem atribut, Anda dapat dengan mudah mengambil atribut tersebut melalui API Refleksi pada kelas refleksi apa pun.
Dengan penambahan tipe campuran dan gabungan, teknik ReflectionParameter getClass(), isCallable(), dan isArray() sekarang tidak digunakan lagi.
Skenarionya demikian karena menggunakan getType(), jauh lebih baik, dan Anda mendapatkan daftar lengkap tipe yang dipenuhi oleh parameter tertentu.

Perbaikan Sintaks PHP 8

Seperti yang kita perhatikan, JIT mencuri berita utama; peningkatan sintaksis PHP 8 memberikan keuntungan kualitas hidup yang besar bagi pengembang PHP.
Tidak peduli itu dalam menghilangkan boilerplate umum di antara argumen konstruktor yang dipromosikan atau pengecualian yang ditingkatkan dan penanganan kesalahan, ada banyak hal yang membuat pengembang merasa senang.

  • tipe semu "campuran"
  • Jenis Serikat
  • Promosi properti Konstruktor Kelas
  • Melempar pengecualian dari ekspresi
  • Atribut
  • ::kelas di mana-mana
  • Tangkap berdasarkan jenis saja
  • Ekspresi Pertandingan

Untuk mempertahankan tujuan blog ini, kami berfokus pada jenis gabungan, atribut, dan ekspresi pencocokan.

Jenis Serikat

Jenis gabungan menunjukkan bahwa suatu nilai adalah satu di antara dua atau lebih jenis yang ditentukan. Ini dilakukan dengan bilah vertikal yang ditempatkan di antara setiap jenis yang diizinkan. Untuk beberapa pengembang yang mendalami anotasi PHP untuk mengembalikan nilai atau menentukan parameter Anda, kemungkinan besar Anda telah melakukannya.
Jenis serikat dapat membawa banyak kerumitan dan kesulitan dalam pemahaman bagi mereka yang menerima banyak jenis yang berbeda atau mengembalikan banyak jenis yang berbeda.
Namun, ini akan sangat berguna pada beberapa kesempatan. Misalnya, jika Anda dapat menerima atau objek yang mengimplementasikan antarmuka Stringable baru (“string|Stringable”), atau string, atau jika Anda dapat menerima objek yang mengimplementasikan antarmuka Traversable (“array|Traversable”) atau array .

Ekspresi Pertandingan

Ekspresi pencocokan memotong tebakan yang terkait untuk mengetahui apakah kegagalan untuk memutus dalam kasus sakelar tertentu disengaja atau tidak. Ini juga menyederhanakan pola normal pemberian nilai berdasarkan kecocokan.
Saat digunakan, nilai yang kita berikan ke match() akan langsung dibandingkan dengan ekspresi apa pun yang ada di sisi kiri. Tidak peduli itu ekspresi atau nilai, nilai yang Anda berikan ke match() harus cocok dengannya agar bisa dipilih.
Saat dicocokkan, ekspresi yang ada di sebelah kanan diperkirakan, dan nilai pengembaliannya dikembalikan, sementara ekspresi hanya dapat berupa fungsi Lambda atau yang dapat dipanggil, dan tidak ada penutupan multi-baris yang diizinkan.

Atribut

PHP 8 mengintegrasikan atribut pada tingkat bahasa juga. Sementara atribut hadir selama lebih dari 15 tahun melalui anotasi docblock, membuatnya dibangun ke dalam bahasa menawarkan kinerja yang lebih baik dan tentu saja, lebih banyak kekuatan dan lebih banyak konsistensi. Kita mungkin akan melihat atribut yang sangat digunakan dalam pengembangan perkakas dan aplikasi cepat.

Kesimpulan

Tentu saja, ada beberapa perubahan pada PHP8. Namun, sepertinya sebagian besar kode usang yang dihilangkan adalah untuk fitur lama yang belum pernah kita lihat digunakan belakangan ini.
Kami cukup tertarik untuk memperhatikan apa dampak mesin JIT pada basis kode yang kami gunakan dan juga pada komunitas PHP yang lebih luas—dengan mengatakan bahwa kami sangat menyarankan untuk memindai basis kode Anda untuk mengetahui ketidaksesuaian dengan PHP8 dan menjalankan unit test untuk memastikan bahwa PHP Anda aplikasi berfungsi dengan sempurna sebelum mengatakan "ya" untuk peningkatan.