Pengantar PHP 7: Apa yang Baru dan Yang Sudah Hilang

Diterbitkan: 2022-03-11

Salah satu peristiwa paling menarik pada tahun 2015 di dunia PHP adalah rilis PHP 7, 10 tahun sejak rilis versi utama terakhir, PHP 5. Dengan langkah maju yang besar, PHP 7 memperkenalkan banyak fitur baru dan peningkatan kinerja .

Namun, ini juga menghapus fungsionalitas lama yang tidak digunakan lagi, yang menyebabkan beberapa gangguan kompatibilitas, sehingga mempersulit aplikasi lama untuk bermigrasi ke versi baru. Panduan ini akan berfungsi sebagai tur singkat tentang apa yang diharapkan jika Anda berencana untuk memindahkan aplikasi yang sudah ada, atau membangun yang baru, di atas PHP 7.

Tapi Tunggu, Ke Mana Perginya PHP 6?

Jika Anda belum pernah bekerja dengan PHP akhir-akhir ini, Anda mungkin bertanya-tanya apa yang terjadi dengan PHP 6, mengapa melompat dari PHP 5 ke PHP 7? Singkat cerita, PHP 6 gagal. Fitur utama dari versi 6 adalah dukungan asli untuk karakter Unicode karena PHP digunakan terutama dalam pengembangan web dan web membutuhkan Unicode, jadi langkah untuk membawa Unicode ke PHP masuk akal.

Idenya adalah untuk membawa dukungan penuh untuk Unicode ke inti itu sendiri. Itu akan membawa kemampuan yang diperluas ke bahasa, dari kemampuan untuk menggunakan emoji konyol sebagai nama variabel dan fungsi, hingga fungsionalitas string internasional yang kuat. Misalnya, ketika bahasa lain menggunakan huruf besar dan kecil secara berbeda dari bahasa Inggris, atau ketika nama dalam karakter Cina perlu diubah ke bahasa Inggris.

Sayangnya, rencana ambisius ini ternyata menjadi masalah yang lebih besar dari yang diperkirakan. Sebagian besar basis kode harus di-porting untuk mendukung Unicode untuk ekstensi inti dan penting, yang terbukti membosankan dan rumit. Ini memperlambat pengembangan fitur lain dalam bahasa tersebut, membuat banyak pengembang PHP frustrasi dalam prosesnya. Rintangan tambahan muncul, yang mengakibatkan berkurangnya minat dalam mengembangkan dukungan Unicode asli, yang pada akhirnya menyebabkan proyek ditinggalkan.

Karena sumber daya, seperti buku dan artikel, telah ditulis untuk PHP 6 dan dukungan Unicode-nya, versi baru akan diganti namanya menjadi PHP 7 untuk menghindari kebingungan.

Ngomong-ngomong, cukup berkutat di masa lalu yang menyedihkan, mari kita lihat apa yang dibawa PHP 7 ke pesta.

Pertarungan Performa, PHP 7 vs. PHP 5

Dengan hampir semua pembaruan, peningkatan kinerja kecil diharapkan. Namun, kali ini PHP membawa peningkatan yang signifikan dari versi sebelumnya yang menjadikan kinerja sebagai salah satu fitur paling menarik dari PHP 7. Ini datang sebagai bagian dari proyek “PHPNG”, yang menangani internal Zend Engine itu sendiri.

Dengan memfaktorkan ulang struktur data internal dan menambahkan langkah perantara ke kompilasi kode dalam bentuk Pohon Sintaks Abstrak (AST), hasilnya adalah kinerja yang unggul dan alokasi memori yang lebih efisien. Angka-angka itu sendiri terlihat sangat menjanjikan; benchmark yang dilakukan pada aplikasi dunia nyata menunjukkan bahwa PHP 7 dua kali lebih cepat dari rata-rata PHP 5.6, dan menghasilkan konsumsi memori 50 persen lebih sedikit selama permintaan, menjadikan PHP 7 saingan kuat untuk kompiler HHVM JIT Facebook. Lihat infografis dari Zend ini yang menggambarkan kinerja untuk beberapa CMS dan Kerangka kerja umum.

Gambar: Ilustrasi kinerja PHP 7 vs. PHP 5.

Penurunan konsumsi memori juga memungkinkan mesin yang lebih kecil untuk menangani permintaan dengan lebih baik bersama dengan peluang untuk membangun layanan mikro di sekitar PHP. Perubahan internal, khususnya implementasi AST, juga membuka kemungkinan untuk optimasi ke depan yang dapat mendorong kinerja lebih jauh. Implementasi internal kompiler JIT yang baru sedang dipertimbangkan untuk versi mendatang.

Gula Sintaks PHP 7

PHP 7 hadir dengan fitur sintaks baru. Meskipun tidak memperluas kemampuan bahasa itu sendiri, mereka menyediakan cara yang lebih baik, atau lebih mudah, untuk membuat kode Anda lebih menyenangkan untuk ditulis dan enak dipandang.

Deklarasi Impor Grup

Sekarang, kita dapat mengelompokkan deklarasi impor untuk kelas yang berasal dari namespace yang sama ke dalam satu baris use . Ini akan membantu menyelaraskan deklarasi dengan cara yang berarti atau hanya menyimpan beberapa byte dalam file Anda.

 use Framework\Module\Foo; use Framework\Module\Bar; use Framework\Module\Baz;

Dengan PHP 7 kita dapat menggunakan:

 use Framework\Module\{Foo, Bar, Baz};

Atau, jika Anda lebih suka gaya multi-garis:

 use Framework\Module{ Foo, Bar, Baz };

Operator Penggabungan Null

Ini memecahkan masalah umum dalam pemrograman PHP, di mana kami ingin memberikan nilai ke variabel dari variabel lain, jika yang terakhir benar-benar ditetapkan, atau memberikan nilai yang berbeda untuk itu. Ini biasanya digunakan saat kami bekerja dengan input yang disediakan pengguna.

Pra-PHP 7:

 if (isset($foo)) { $bar = $foo; } else { $bar = 'default'; // we would give $bar the value 'default' if $foo is NULL }

Setelah PHP 7:

 $bar = $foo ?? 'default';

Ini juga dapat dirantai dengan sejumlah variabel:

 $bar = $foo ?? $baz ?? 'default';

Operator Pesawat Luar Angkasa

Operator pesawat ruang angkasa <=> memungkinkan perbandingan tiga arah antara dua nilai, tidak hanya menunjukkan apakah keduanya sama, tetapi juga mana yang lebih besar, pada ketidaksetaraan dengan mengembalikan 1,0 atau -1.

Di sini kita dapat mengambil tindakan yang berbeda tergantung pada bagaimana nilainya berbeda:

 switch ($bar <=> $foo) { case 0: echo '$bar and $foo are equal'; case -1: echo '$foo is bigger'; case 1: echo '$bar is bigger'; }

Nilai yang dibandingkan dapat berupa integer, float, string, atau bahkan array. Periksa dokumentasi untuk mendapatkan gambaran tentang bagaimana nilai yang berbeda dibandingkan satu sama lain. [https://wiki.php.net/rfc/combined-comparison-operator]

Fitur Baru Di PHP 7

Tapi tentu saja PHP 7 juga membawa fungsionalitas baru dan menarik dengannya.

Jenis Parameter Skalar & Petunjuk Jenis Pengembalian

PHP 7 memperluas deklarasi parameter tipe sebelumnya dalam metode (kelas, antarmuka dan array) dengan menambahkan empat tipe skalar; Integer ( int ), float ( float ), boolean ( bool ) dan string ( string ) sebagai tipe parameter yang memungkinkan.

Selanjutnya, kita dapat secara opsional menentukan jenis metode dan fungsi yang dikembalikan. Tipe yang didukung adalah bool , int , float , string , array , callable , nama Class atau Interface , self dan parent ( untuk metode class )

 class Calculator { // We declare that the parameters provided are of type integer public function addTwoInts(int $x, int $y): int { return $x + $y; // We also explicitly say that this method will return an integer } }

Deklarasi tipe memungkinkan pembuatan aplikasi yang lebih kuat dan menghindari meneruskan dan mengembalikan nilai yang salah dari fungsi. Manfaat lain termasuk penganalisis kode statis dan IDE, yang memberikan wawasan yang lebih baik tentang basis kode jika ada DocBlocks yang hilang.

Karena PHP adalah bahasa yang diketik dengan lemah, nilai-nilai tertentu untuk parameter dan tipe pengembalian akan diberikan berdasarkan konteksnya. Jika kita melewatkan nilai “3” dalam fungsi yang memiliki parameter yang dideklarasikan bertipe int , interpreter akan menerimanya sebagai bilangan bulat dan tidak membuang kesalahan apa pun. Jika Anda tidak menginginkan ini, Anda dapat mengaktifkan strict mode dengan menambahkan direktif declare .

declare(strict_types=1);

Ini diatur dalam basis per-file, karena opsi global akan membagi repositori kode ke repositori yang dibangun dengan ketat global dan yang tidak, menghasilkan perilaku yang tidak diharapkan saat kita menggabungkan kode dari keduanya.

Pengecualian Mesin

Dengan tambahan pengecualian mesin, kesalahan fatal yang akan mengakibatkan penghentian skrip dapat ditangkap dan ditangani dengan mudah.

Kesalahan seperti memanggil metode yang tidak ada tidak akan menghentikan skrip, melainkan melemparkan pengecualian yang dapat ditangani oleh blok coba tangkap, yang meningkatkan penanganan kesalahan untuk aplikasi Anda. Ini penting untuk jenis aplikasi, server, dan daemon tertentu karena kesalahan fatal akan mengharuskan mereka untuk memulai ulang. Pengujian di PHPUnit juga harus menjadi lebih bermanfaat karena kesalahan fatal menjatuhkan seluruh rangkaian pengujian. Pengecualian, bukan kesalahan, akan ditangani per kasus uji.

PHP 7 menambahkan sejumlah kelas pengecualian baru berdasarkan jenis kesalahan yang mungkin ditemui. Untuk menjaga kompatibilitas antar versi, antarmuka Throwable baru telah ditambahkan yang dapat diimplementasikan dari pengecualian mesin dan pengecualian pengguna. Ini diperlukan untuk menghindari pengecualian mesin untuk memperluas kelas pengecualian dasar, menghasilkan pengecualian penangkapan kode yang lebih lama yang tidak ada sebelumnya.

Sebelum PHP 7 ini akan menghentikan skrip dengan kesalahan fatal:

 try { thisFunctionDoesNotEvenExist(); } catch (\EngineException $e) { // Clean things up and log error echo $e->getMessage(); }

Kelas Anonim

Kelas anonim adalah sepupu dari fungsi anonim yang mungkin Anda gunakan dalam contoh jangka pendek yang sederhana. Kelas anonim mudah dibuat dan digunakan seperti objek biasa. Berikut adalah contoh dari dokumen.

Pra-PHP 7

 class MyLogger { public function log($msg) { print_r($msg . "\n"); } } $pusher->setLogger( new MyLogger() );

Dengan kelas anonim:

 $pusher->setLogger(new class { public function log($msg) { print_r($msg . "\n"); } });

Kelas anonim berguna dalam pengujian unit, terutama dalam mengejek objek dan layanan uji. Ini membantu kami menghindari pustaka dan kerangka kerja yang mengejek dengan membuat objek sederhana yang menyediakan antarmuka yang ingin kami tiru.

Fungsi CSPRNG

Dua fungsi baru untuk menghasilkan string dan bilangan bulat yang aman secara kriptografis telah ditambahkan.

 random_bytes(int $len);

Mengembalikan string acak dengan panjang $len .

 random_int(int $min, int $max);

Mengembalikan angka antara $min dan $max .

Sintaks Escape Codepoint Unicode

Tidak seperti banyak bahasa lain, sebelum PHP 7, PHP tidak memiliki cara untuk keluar dari titik kode Unicode dalam literal string, . Fungsionalitas ini menambahkan urutan escape \u untuk menghasilkan karakter seperti itu menggunakan codepoint UTF-8 mereka. Ini lebih baik daripada memasukkan karakter secara langsung, memungkinkan penanganan yang lebih baik dari karakter yang tidak terlihat serta karakter yang memiliki representasi grafis yang sama tetapi berbeda dalam arti.

echo "\u{1F602}"; // outputs ‚

Perhatikan bahwa ini merusak kode yang ada dengan urutan \u karena mengubah perilaku.

Generator Dapatkan Upgrade

Generator di PHP juga mendapatkan beberapa fitur tambahan yang bagus. Sekarang, generator memiliki pernyataan kembali yang dapat digunakan untuk memungkinkannya menghasilkan nilai akhir setelah iterasi. Ini dapat digunakan untuk memeriksa apakah generator telah dieksekusi tanpa kesalahan dan memungkinkan kode yang dipanggil generator untuk menangani berbagai skenario dengan tepat.

Selanjutnya, generator dapat mengembalikan dan menghasilkan ekspresi dari generator lain. Hal ini memungkinkan mereka untuk membagi operasi yang kompleks menjadi unit yang lebih sederhana dan modular.

 function genA() { yield 2; yield 3; yield 4; } function genB() { yield 1; yield from genA(); // 'genA' gets called here and iterated over yield 5; return 'success'; // This is a final result we can check later } foreach (genB() as $val) { echo "\n $val"; // This will output values 1 to 5 in order } $genB()->getReturn(); // This should return 'success' when there are no errors.

Harapan

Ekspektasi adalah peningkatan pada fungsi assert() sambil mempertahankan kompatibilitas ke belakang. Mereka memungkinkan pernyataan tanpa biaya dalam kode produksi, dan memberikan kemampuan untuk membuang pengecualian khusus saat pernyataan gagal, yang dapat berguna selama pengembangan.

assert() menjadi konstruksi bahasa di PHP 7. Pernyataan harus digunakan untuk tujuan debugging hanya di lingkungan pengembangan dan pengujian. Untuk mengkonfigurasi perilakunya, kami diberikan dua arahan baru.

  • zend.assertions
    • 1 : menghasilkan dan mengeksekusi kode (mode pengembangan) (nilai default)
    • 0 : menghasilkan kode tetapi melompatinya saat runtime
    • -1 : tidak menghasilkan kode sehingga tidak ada biaya (mode produksi)
  • assert.exception
    • 1 : melempar ketika pernyataan gagal, baik dengan melemparkan objek yang disediakan sebagai pengecualian atau dengan melemparkan objek AssertionError baru jika pengecualian tidak diberikan
    • 0 : menggunakan atau menghasilkan Throwable seperti dijelaskan di atas, tetapi hanya menghasilkan peringatan berdasarkan objek itu daripada membuangnya (kompatibel dengan perilaku PHP 5)

Bersiap Untuk Pindah Dari PHP 5 Ke PHP 7

Pengenalan rilis utama membawa peluang untuk mengubah/memperbarui fungsionalitas yang lebih lama atau bahkan menghapusnya jika dianggap terlalu tua atau tidak digunakan lagi untuk beberapa waktu. Perubahan tersebut dapat menyebabkan jeda dalam kompatibilitas di aplikasi yang lebih lama.

Masalah lain yang muncul dari lompatan versi tersebut adalah bahwa pustaka dan kerangka kerja penting yang Anda andalkan mungkin belum diperbarui untuk mendukung versi terbaru. Tim PHP telah mencoba membuat perubahan baru sekompatibel mungkin dan memungkinkan migrasi ke versi baru semudah mungkin. Aplikasi yang lebih baru dan lebih mutakhir akan lebih mudah dipindahkan ke versi baru, sedangkan aplikasi yang lebih lama mungkin harus memutuskan apakah manfaatnya lebih besar daripada biayanya, mungkin memilih untuk tidak memperbarui.

Sebagian besar istirahat kecil dan dapat dikurangi dengan mudah sementara yang lain mungkin memerlukan lebih banyak usaha dan waktu. Pada dasarnya, jika Anda memiliki peringatan penghentian di aplikasi Anda sebelum menginstal PHP 7, Anda mungkin akan mendapatkan kesalahan yang akan merusak aplikasi hingga diperbaiki. Anda diperingatkan, bukan?

SAPI dan Ekstensi Lama

Yang paling penting, SAPI lama dan usang telah dihapus seperti ekstensi mysql (tetapi Anda tidak boleh menggunakan ini sejak awal, kan?). Untuk daftar lengkap ekstensi dan fitur yang dihapus, Anda dapat memeriksa RFC ini di sini dan di sini.

Selain itu, SAPI lain sedang porting ke PHP 7.

Banyak SAPI dan ekstensi lama dijatuhkan dari PHP 7. Kami menduga mereka tidak akan terlewatkan.

Sintaks Variabel Seragam

Pembaruan ini membuat beberapa perubahan yang mendukung konsistensi untuk konstruksi variabel-variabel. Ini memungkinkan ekspresi yang lebih maju dengan variabel tetapi memperkenalkan perubahan perilaku dalam beberapa kasus lain, seperti yang ditunjukkan di bawah ini.

 // old meaning // new meaning $$foo['bar']['baz'] ${$foo['bar']['baz']} ($$foo)['bar']['baz'] $foo->$bar['baz'] $foo->{$bar['baz']} ($foo->$bar)['baz'] $foo->$bar['baz']() $foo->{$bar['baz']}() ($foo->$bar)['baz']() Foo::$bar['baz']() Foo::{$bar['baz']}() (Foo::$bar)['baz']()

Ini akan mematahkan perilaku aplikasi yang mengakses nilai seperti ini. Di sisi lain, Anda dapat melakukan beberapa hal rapi seperti ini:.

 // Nested () foo()(); // Calls the return of foo() $foo->bar()(); // IIFE syntax like JavaScript (function() { // Function body })(); // Nested :: $foo::$bar::$baz

Tag Gaya Lama Dihapus

Tag pembuka/penutup <% ... %> , <%= ... %> , <script language="php"> ... </script> dihapus dan tidak valid lagi. Menggantinya dengan yang valid seharusnya mudah, tetapi apa yang Anda lakukan menggunakannya, Aneh?

Nama Tidak Valid untuk Kelas, Antarmuka, dan Sifat

Hasil dari penambahan seperti kelas parameter dan tipe pengembalian, antarmuka, dan sifat tidak lagi diizinkan memiliki nama berikut:

  • bool
  • ke dalam
  • mengambang
  • rangkaian
  • batal
  • benar
  • Salah

Ini menyebabkan kerusakan pada aplikasi dan pustaka yang ada yang menggunakannya, tetapi seharusnya mudah diperbaiki. Selain itu, meskipun tidak menyebabkan kesalahan dan valid, yang berikut ini tidak boleh digunakan karena dicadangkan untuk penggunaan di masa mendatang:

  • sumber
  • obyek
  • Campuran
  • numerik

Menahan diri dari menggunakannya akan membuat Anda tidak perlu mengubahnya di masa depan.

Untuk daftar lengkap perubahan yang akan merusak kompatibilitas, periksa dokumen ini.

Anda juga dapat menggunakan php7cc, yang memeriksa kode Anda dan dapat mendeteksi masalah potensial yang mungkin muncul jika Anda pindah ke PHP 7. Tapi tentu saja, tidak ada cara yang lebih baik daripada menginstal PHP 7 dan melihatnya sendiri.

Potensi Masalah Kompatibilitas PHP 7

Kompatibilitas Infrastruktur PHP 7

Banyak layanan hosting mulai menambahkan dukungan untuk PHP 7. Ini adalah kabar baik bagi penyedia hosting bersama, karena peningkatan kinerja akan memungkinkan mereka untuk meningkatkan jumlah situs web klien pada perangkat keras mereka, mengurangi biaya operasional dan meningkatkan margin mereka. Adapun klien itu sendiri, mereka seharusnya tidak mengharapkan terlalu banyak dorongan dalam kondisi ini, tetapi untuk bersikap adil, hosting bersama bukanlah pilihan yang berorientasi pada kinerja.

Di sisi lain, layanan yang menawarkan server pribadi virtual atau server khusus akan menuai manfaat penuh dari peningkatan kinerja ini. Beberapa layanan PaaS seperti Heroku mendukung PHP 7 sejak awal, tetapi layanan lain, seperti AWS Beanstalk dan Oracle's OpenShift, tertinggal di belakang. Periksa situs web penyedia PaaS Anda untuk melihat apakah PHP 7 sudah didukung, atau apakah dukungan akan datang dalam waktu dekat.

Tentu saja, penyedia IaaS memungkinkan Anda untuk mengendalikan perangkat keras dan menginstal PHP 7 (atau kompilasi jika itu lebih sesuai dengan keinginan Anda). Paket PHP 7 sudah tersedia untuk lingkungan IaaS utama.

Kompatibilitas Perangkat Lunak PHP 7

Selain kompatibilitas infrastruktur, Anda juga harus memperhatikan potensi masalah kompatibilitas perangkat lunak. Sistem manajemen konten populer seperti WordPress, Joomla, dan Drupal telah menambahkan dukungan untuk PHP 7 dengan rilis terbaru mereka. Kerangka kerja utama seperti Symfony dan Laravel juga menikmati dukungan penuh.

Namun, sudah waktunya untuk kata hati-hati. Dukungan ini tidak mencakup kode pihak ketiga dalam bentuk add-on, plugin, paket, atau apa pun yang disebut oleh CMS atau kerangka kerja Anda. Mereka mungkin mengalami masalah kompatibilitas dan Anda bertanggung jawab untuk memastikan semuanya siap untuk PHP 7.

Untuk repositori yang aktif dan terpelihara, ini seharusnya tidak menjadi masalah. Namun, repositori lama dan tidak terawat yang tidak memiliki dukungan PHP 7 dapat membuat seluruh aplikasi Anda tidak dapat digunakan.

Masa depan PHP

Rilis PHP 7 menghapus kode lama dan usang dan membuka jalan bagi fitur baru dan peningkatan kinerja di masa mendatang. Plus, PHP diharapkan untuk mendapatkan optimasi kinerja tambahan segera. Meskipun memiliki beberapa gangguan kompatibilitas dengan rilis sebelumnya, sebagian besar masalah mudah diselesaikan.

Pustaka dan kerangka kerja sekarang memigrasikan kode mereka ke PHP 7 sehingga menyediakan versi terbaru. Saya mendorong Anda untuk mencobanya dan lihat sendiri hasilnya. Mungkin aplikasi Anda sudah kompatibel dan menunggu untuk digunakan, dan manfaat dari, PHP 7.

Terkait: Daftar 10 Kesalahan Paling Umum yang Dilakukan Pengembang PHP