Meskipun versi baru PHP adalah minor, ia sudah membawa banyak fitur baru, tanpa berlebihan, keren untuk sintaks bahasa dan kinerjanya. Daftar inovasi belum final, tetapi perubahan utama telah dibuat dan diterima. Rilis ini dijadwalkan untuk Desember 2019.

Perubahan utama untuk versi yang akan datang:
- Properti Kelas yang Diketik
- Preload untuk kinerja yang lebih baik
- Panah fungsi untuk menulis fungsi anonim singkat
- Menetapkan operator serikat dengan nol (?? =)
- Kovarian / contravariance dalam tanda tangan metode warisan
- Antarmuka fungsi eksternal yang membuka kemungkinan baru untuk mengembangkan ekstensi dalam PHP
- Buka paket operator dalam array
Baca lebih lanjut tentang ini dan perubahan lainnya di bawah kucing.
Penafian: Beberapa kali dalam diskusi saya dengan kolega menampilkan artikel Brent " Baru dalam PHP 7.4 ". Pada awalnya saya ingin membuat terjemahan, tetapi dalam prosesnya saya menyadari bahwa tidak semua pembaruan terbaru ditunjukkan dalam teks dan ada beberapa ketidakakuratan, jadi artikel ini muncul sebagai ganti terjemahan.Fungsi Panah ( RFC )
Fungsi panah memungkinkan Anda membuat catatan singkat tentang fungsi anonim:
array_map(function (User $user) { return $user->id; }, $users) array_map(fn(User $user) => $user->id, $users)
Beberapa fitur penerapan yang diadopsi fungsi panah:
- Mereka dapat mengakses ruang lingkup
parent
, sehingga tidak perlu menggunakan kata kunci penggunaan. $this
juga tersedia, seperti pada fungsi anonim biasa.- Fungsi panah hanya dapat berisi satu baris, yang juga merupakan operator balik.
Anda dapat membaca lebih lanjut tentang mereka di
artikel ini di Habr.
Properti yang Diketik ( RFC )
Hore! Properti kelas sekarang dapat memiliki petunjuk jenis. Ini adalah perubahan yang sangat dinanti sejak PHP 7 ke arah pengetikan bahasa yang lebih kuat. Sekarang kami memiliki semua fitur dasar untuk pengetikan yang kuat. Semua tipe tersedia untuk mengetik, kecuali
void
dan bisa
callable.
class Bar { public string $name; public ?int $amount; public Foo $foo; }
Jika Anda ingin saya mempertimbangkan secara lebih terperinci kemungkinan-kemungkinan baru untuk mengetikkan properti objek, catat dalam komentar dan saya akan menulis artikel terpisah tentang mereka!
Tetapkan null join operator ( RFC )
Alih-alih entri yang panjang:
$data['date'] = $data['date'] ?? new DateTime();
Sekarang mungkin untuk menulis seperti ini:
$data['date'] ??= new DateTime();
Operator Pembongkaran Array ( RFC )
Sekarang Anda dapat menggunakan operator unpack dalam array:
$arrayA = [1, 2, 3]; $arrayB = [4, 5]; $result = [0, ...$arrayA, ...$arrayB, 6 ,7]; <i>// [0, 1, 2, 3, 4, 5, 6, 7]</i>
Harap dicatat bahwa ini hanya berfungsi dengan array non-asosiatif.
External Function Interface ( RFC )
Antarmuka fungsi eksternal (FFI) memungkinkan Anda untuk menulis kode C secara langsung dalam kode PHP. Ini berarti ekstensi PHP dapat ditulis dalam PHP murni.
Perlu dicatat bahwa ini adalah topik yang kompleks. Anda masih membutuhkan pengetahuan tentang C untuk menggunakan fitur-fitur ini dengan benar.
Preload ( RFC )
Preloading adalah tambahan hebat untuk inti PHP, yang seharusnya mengarah pada beberapa peningkatan kinerja yang signifikan.
Misalnya, jika Anda menggunakan kerangka kerja, file-nya harus diunduh dan dikompilasi ulang untuk setiap permintaan. Saat menggunakan opcache - pertama kali file-file ini terlibat dalam pemrosesan permintaan dan kemudian setiap kali mereka berhasil memeriksa perubahan. Preloading memungkinkan server untuk memuat file PHP yang ditentukan ke dalam memori saat startup dan membuatnya selalu tersedia untuk semua permintaan berikutnya, tanpa pemeriksaan tambahan untuk perubahan file.
Peningkatan kinerja "tidak gratis" - jika file yang dimuat diubah, server harus dihidupkan ulang.
Kovarian / contravariance dalam tanda tangan metode lama ( RFC )
Saat ini, PHP memiliki sebagian besar tipe parameter invarian dan tipe return invarian. Perubahan ini memungkinkan Anda untuk mengubah jenis parameter ke salah satu dari supertipenya. Pada gilirannya, tipe yang dikembalikan dapat diganti dengan subtipe-nya. Dengan demikian, perubahan ini akan memungkinkan untuk lebih ketat mengikuti prinsip substitusi Barbara Liskov.
Contoh menggunakan tipe pengembalian kovarian:
interface Factory { function make(): object; } class UserFactory implements Factory { function make(): User; }
dan argumen kontravarian:
interface Concatable { function concat(Iterator $input); } class Collection implements Concatable { function concat(iterable $input) {/* . . . */} }
Serialisasi Objek Khusus ( RFC )
Dua metode ajaib baru tersedia:
__serialize
dan
__unserialize
. Mekanisme serialisasi ini menggabungkan keserbagunaan antarmuka
Serializable
dengan pendekatan penerapan metode
__sleep/__wakeup
. Rincian lebih lanjut tentang perbedaan mereka dapat ditemukan di RFC.
Prioritas Rangkaian ( RFC )
Jika Anda menulis sesuatu seperti ini:
echo "sum: " . $a + $b;
PHP sekarang akan menafsirkan ini sebagai:
echo ("sum: " . $a) + $b;
PHP 8 akan menafsirkan ini secara berbeda:
echo "sum :" . ($a + $b);
PHP 7.4 menambahkan peringatan usang ketika mendeteksi ekspresi yang mengandung "." sebelum tanda "+" atau "-" dan tidak dikelilingi tanda kurung.
__toString
( RFC ) dukungan pengecualian
Sebelumnya, pengecualian tidak bisa dilemparkan dari metode sihir
__toString
. Alasan untuk perilaku ini adalah bahwa konversi objek ke string dilakukan di banyak fungsi perpustakaan standar, dan tidak semua dari mereka siap untuk "memproses" pengecualian dengan benar. Sebagai bagian dari RFC ini, audit komprehensif atas konversi string dalam basis kode telah dilakukan, dan pembatasan ini sekarang dapat dihapus, yang telah dilakukan.
Link Reflection ( RFC )
Perpustakaan, seperti
symfony/var-dumper
, sangat bergantung pada
ReflectionAPI
untuk secara akurat menampilkan variabel. Sebelumnya, tidak ada dukungan yang tepat untuk refleksi tautan, yang memaksa perpustakaan ini untuk mengandalkan peretasan untuk mendeteksi tautan. PHP 7.4 menambahkan kelas
ReflectionReference
yang memecahkan masalah ini.
Menambahkan mb_str_split
( RFC )
Fungsi ini menyediakan fungsionalitas yang sama dengan
str_split
, tetapi untuk string yang ditulis dalam pengkodean multibyte.
Ekstensi ext-hash
( RFC ) yang selalu tersedia
Ekstensi ini sekarang selalu tersedia di semua instalasi PHP.
PEAR tidak diaktifkan secara default ( EKSTERNAL )
PEAR tidak lagi didukung secara aktif, tim inti memutuskan untuk menghapusnya dari instalasi default dengan PHP 7.4.
Registry Algoritma Hashing Kata Sandi ( RFC )
Fungsi
password_algos
baru telah ditambahkan, yang mengembalikan daftar semua algoritma hashing kata sandi terdaftar.
Weak Links ( RFC )
Tautan yang lemah memungkinkan Anda menyimpan tautan ke objek yang tidak mencegah penghancuran objek ini. Sebagai contoh, mereka berguna untuk mengimplementasikan struktur seperti cache.
Pembatas literal angka ( RFC )
Tidak adanya pemisah visual dalam kelompok angka meningkatkan waktu untuk membaca dan men-debug kode, dan dapat menyebabkan kesalahan yang tidak disengaja. Sekarang menambahkan dukungan untuk karakter garis bawah dalam literal angka untuk memisahkan kelompok angka secara visual.
1_000_000_000 // int 6.674_083e-11; // float 299_792_458; // decimal 0xCAFE_F00D; // hexadecimal 0b0101_1111; // binary 0137_041; // octal
Tag Terbuka Pendek Dihentikan ( RFC )
Tag pembuka pendek
<?
sudah tidak digunakan lagi dan akan dihapus dalam PHP 8. Tag pendek
<?= (echo)
tidak terpengaruh.
Operator Ternary Kiri Associative Decosed Uss ( RFC )
Operator ternary memiliki beberapa keanehan aneh di PHP. RFC ini tidak lagi menggunakan operator ternary yang bersarang.
1 ? 2 : 3 ? 4 : 5; // deprecated (1 ? 2 : 3) ? 4 : 5; // ok
Di PHP 8, catatan seperti itu akan menghasilkan kesalahan tingkat kompilasi.
Perubahan Tidak Kompatibel Mundur ( PENINGKATAN )
Berikut adalah beberapa perubahan mundur yang paling penting:
- Panggilan ke
parent::
di kelas tanpa orangtua tidak digunakan lagi. - Memanggil
var_dump
pada instance DateTime
atau DateTimeImmutable
tidak lagi membuat properti objek tersedia. openssl_random_pseudo_bytes
akan mengeluarkan pengecualian dalam situasi kesalahan yang disebabkan oleh perpustakaan OpenSSL. Sebelumnya, itu mengembalikan false, yang dapat menyebabkan generasi string kosong.- Mencoba untuk membuat serial
PDO
atau instance dari PDOStatement
melempar Exception
alih-alih PDOException
. - Memanggil
get_object_vars()
pada instance ArrayObject
mengembalikan properti ArrayObject
itu sendiri, bukan nilai array yang dibungkus. Untuk mendapatkan nilai array yang dibungkus seperti sebelumnya, ArrayObject
ke tipe array
.