Fitur Baru, Penghentian, Perubahan di PHP 8.2 – PHP 8.2 dibangun di atas basis baru yang ditetapkan oleh PHP 8.0 dan PHP 8.1 . Sekarang PHP 8.2 telah dirilis, mari kita bahas apa yang baru di PHP 8.2 secara mendetail mulai dari fitur baru dan peningkatan hingga penghentian dan perubahan kecil, kita akan membahas semuanya.

Karena PHP 8.2 memasuki pembekuan fiturnya pada 19 Juli 2022, Anda tidak dapat mengharapkan tambahan yang signifikan pada daftar ini.

Fitur dan Peningkatan Baru di PHP 8.2

Mari kita mulai dengan menjelajahi semua fitur terbaru PHP 8.2. Ini daftar yang cukup luas:

  • Kelas readonly baru
  • Izinkan benar, salah, dan nol sebagai Jenis Mandiri
  • Jenis Bentuk Normal Disjungtif (DNF).
  • Redact Parameter Sensitif di Back Traces
  • Fungsi baru mysqli_execute_query dan metode mysqli::execute_query
  • Ambil Properti enum dalam Ekspresi const
  • Izinkan Konstanta dalam Sifat
  • Menghentikan Properti Dinamis (dan Atribut #[AllowDynamicProperties] Baru)
  • Hentikan Callables yang Didukung Sebagian
  • Menghentikan fungsi #utf8_encode() dan utf8_decode()
  • Menghentikan Interpolasi String ${}
  • Menghentikan Fungsi mbstring untuk Entitas Base64/QPrint/Uuencode/HTML
  • Hapus Dukungan untuk libmysql dari mysqli
  • Konversi Kasus Lokal-Independen
  • Peningkatan Ekstensi Acak

Kelas Baru

PHP 8.1 memperkenalkan readonlyfitur untuk properti kelas . Sekarang, PHP 8.2 menambahkan dukungan untuk mendeklarasikan seluruh kelas sebagaireadonly.

Jika Anda mendeklarasikan kelas sebagai readonly, semua propertinya akan secara otomatis mewarisi readonlyfitur tersebut. Jadi, mendeklarasikan kelas readonlysama dengan mendeklarasikan setiap properti kelas sebagai readonly.

Misalnya, dengan PHP 8.1, Anda harus menulis kode membosankan ini untuk mendeklarasikan semua properti kelas sebagai readonly:
class MyClass
{
public readonly string $myValue,
public readonly int $myOtherValue
public readonly string $myAnotherValue
public readonly int $myYetAnotherValue
}

Bayangkan hal yang sama dengan lebih banyak properti. Sekarang, dengan PHP 8.2, Anda bisa menulis ini:

readonly class MyClass
{
public string $myValue,
public int $myOtherValue
public string $myAnotherValue
public int $myYetAnotherValue
}
Anda juga dapat mendeklarasikan kelas abstrak atau final sebagai readonly. Di sini, urutan kata kunci tidak menjadi masalah.

abstract readonly class Free {}
final readonly class Dom {}

Anda juga dapat mendeklarasikan readonlykelas tanpa properti. Secara efektif, ini mencegah properti dinamis sambil tetap mengizinkan kelas anak untuk mendeklarasikan readonlypropertinya secara eksplisit.

Selanjutnya, readonlykelas hanya dapat berisi properti yang diketik aturan yang sama untuk mendeklarasikan properti hanya baca individual .

Anda dapat menggunakan mixedproperti type jika Anda tidak dapat mendeklarasikan properti yang diketik secara ketat.

Kesalahan Fatal

Mencoba mendeklarasikan readonlykelas tanpa properti yang diketik akan menghasilkan kesalahan Fatal:

readonly class Type {
public $nope;
}
Fatal error: Readonly property Type::$nope must have type in … on line …
Selain itu, Anda tidak dapat mendeklarasikan readonlyfitur PHP tertentu:

  • Enum (karena tidak dapat berisi properti apa pun )
  • Sifat-sifat
  • Antarmuka

Mencoba mendeklarasikan salah satu fitur ini readonlyakan mengakibatkan kesalahan Parse.
readonly interface Destiny {}
Parse error: syntax error, unexpected token “interface”, expecting “abstract” or “final” or “readonly” or “class” in … on line …

Izinkan  true,  false, dan  nullsebagai Jenis Mandiri

Seperti halnya semua kata kunci PHP, readonlykata kunci tersebut tidak peka huruf besar-kecil.

PHP 8.2 juga menghentikan properti dinamis (lebih lanjut nanti). Tapi Anda tidak bisa mencegah properti dinamis ditambahkan ke kelas. Namun, melakukan hal tersebut untuk sebuah readonlykelas hanya akan menghasilkan Fatal Error.

Fatal error: Readonly property Test::$test must have type in … on line …
Izinkan true, false, dan nullsebagai Jenis Mandiri PHP sudah menyertakan tipe skalar seperti int, string, dan bool.

Itu diperluas di PHP 8.0 dengan penambahan union types , yang memungkinkan nilai menjadi tipe yang berbeda. RFC yang sama juga memungkinkan penggunaan falsedan nullsebagai bagian dari tipe gabungan — mereka tidak diizinkan sebagai tipe yang berdiri sendiri.

Jika Anda mencoba mendeklarasikan falseatau nullatau sebagai tipe mandiri — tanpa menjadi bagian dari tipe gabungan — hasilnya adalah kesalahan fatal.

function spam(): null {}
function eggs(): false {}

Fatal error: Null can not be used as a standalone type in … on line …
Fatal error: False can not be used as a standalone type in … on line …

Untuk menghindari skenario ini, PHP 8.2 menambahkan dukungan untuk menggunakan falsedannull sebagai tipe mandiri. Dengan tambahan ini, sistem tipe PHP lebih ekspresif dan lengkap. Anda sekarang dapat mendeklarasikan tipe pengembalian, parameter, dan properti dengan tepat.

Selain itu, PHP masih belum menyertakan truetipe, yang tampaknya merupakan pasangan alami dari falsetipe tersebut. PHP 8.2 memperbaikinya dan menambahkan dukungan untuk truetipe tersebut juga. Itu tidak memungkinkan paksaan, persis seperti falseperilaku tipenya.

Keduanya truedan falsetipe pada dasarnya adalah tipe gabungan dari tipe PHP bool. Untuk menghindari redundansi, Anda tidak dapat mendeklarasikan ketiga tipe ini bersama-sama dalam tipe gabungan. Melakukannya akan menghasilkan kesalahan fatal waktu kompilasi.

Jenis Bentuk Normal Disjungtif (DNF).

Bentuk Normal Disjungtif (DNF) adalah cara standar mengatur ekspresi boolean. Ini terdiri dari disjungsi konjungsi — dalam istilah boolean, itu adalah OR dari ANDs .

Menerapkan DNF ke deklarasi tipe memungkinkan cara standar untuk menulis gabungan tipe Union dan Intersection yang dapat ditangani oleh parser. Fitur tipe DNF baru PHP 8.2 sederhana namun kuat jika digunakan dengan benar.

RFC memberikan contoh berikut. Ini mengasumsikan definisi antarmuka dan kelas berikut sudah ada:

interface A {}
interface B {}
interface C extends A {}
interface D {}

class W implements A {}
class X implements B {}
class Y implements A, B {}
class Z extends Y implements C {}

Dengan tipe DNF, Anda dapat melakukan deklarasi tipe untuk properti, parameter, dan mengembalikan nilai seperti:

// Accepts an object that implements both A and B,
// OR an object that implements D
(A&B)|D

// Accepts an object that implements C,
// OR a child of X that also implements D,
// OR null
C|(X&D)|null

// Accepts an object that implements all three of A, B, and D,
// OR an int,
// OR null.
(A&B&D)|int|null

Dalam beberapa kasus, properti mungkin tidak dalam bentuk DNF. Mendeklarasikannya seperti itu akan menghasilkan kesalahan penguraian. Tetapi Anda selalu dapat menulis ulang sebagai:

A&(B|D)
// Can be rewritten as (A&B)|(A&D)

A|(B&(D|W)|null)
// Can be rewritten as A|(B&D)|(B&W)|null
Anda harus mencatat bahwa setiap segmen tipe DNF harus unik. Misalnya, mendeklarasikan (A&B)|(B&A)tidak valid karena dua segmen OR ed secara logis sama.

Selain itu, segmen yang merupakan subkumpulan ketat dari segmen lain juga tidak diizinkan. Itu karena superset sudah memiliki semua instance dari subset, membuatnya berlebihan untuk menggunakan DNF.