Fitur-fitur baru PHP 8

2 min read

Disclaimer
Saya bekerja di AWS, semua opini adalah dari saya pribadi. (I work for AWS, my opinions are my own.)
Fitur PHP 8
Logo PHP 8 (Sumber: php.net)

TeknoCerdas.com – Salam cerdas untuk kita semua. PHP 8 baru saja dirilis oleh tim pengembang PHP. PHP 8 adalah rilis besar pertama setelah PHP 7. Cukup banyak fitur atau perubahan yang disematkan pada PHP 8. Tulisan ini akan membahas apa saja fitur-fitur baru pada PHP 8.

Berikut ini adalah daftar fitur baru dan perubahan yang ada pada PHP 8.

Named Arguments

Ini salah satu fitur baru yang saya suka. Mirip seperti apa yang dimiliki oleh Python. Kita ambil contoh sebuah fungsi PHP dengan argumen yang cukup panjang yaitu setcookie. Sehingga urutan argumen tidak perlu diperhatikan ketika pemanggilan dilakukan.

// PHP 7
setcookie("mycookie", "myvalue", 0, null, null, false, true);
// PHP 8
setcookie(httponly: true, value: "myvalue", name: "mycookie");

Pada PHP 8 kode lebih self-documented dan dapat melakukan skip optional parameter. Syntax dari named arguments mirip dengan Javascript object.

Baca Juga:
Proposal Named Arguments pada PHP 8

Constructor Property Promotion

Fitur kedua yang saya suka adalah constructory property promotion. Karena dengan adanya fitur ini, menghindari penulisan berulang-ulang atribut pada sebuah class constructor.

// PHP 7
class Person
{
    public $name;
    public $address;
    public $city;

    public function __constructor($name, $address, $city)
    {
        $this->name = $name;
        $this->address = $address;
        $this->city = $city;
    }
}
// PHP 8
class Person
{
    public function __constructor(public $name = "", public $address = "", public $city = "")
    {
    }
}

Dapat dilihat jika deklarasi atribut langsung dilakukan pada parameter dari class constructor untuk menghindari deklarasi yang berulang.

Match Expression

Saya bukan penggemar penggunaan percabangan else atau switch. Saya selalu menghindari penggunaan keduanya jika memungkinkan dan hanya menggunakan if saja jika perlu. Dengan adanya Match expression tentu saya sangat menyukainya.

// PHP 7
switch ("cerdas") {
  case "tekno":
    echo "Berita teknologi";
    break;

  case "cerdas":
    echo "yang menderdaskan";
    break;
}
// PHP 8
echo match ("cerdas") {
  "tekno" => "Berita teknologi",
  "cerdas" => "yang menderdaskan"
};

Nullsafe Operator

Dengan adanya fitur Nullsafe operator maka pemanggilan sebuah method pada sebuah objek dalam rantai pemanggilan tidak akan menghasilkan pesan error jika atribut dari objek tersebut adalah null. Untuk menghindari error biasanya developer melakukan pengecekan nilai terlebih dahulu sebelum mengakses objek.

// PHP 7
$country = $null;

if ($user === null) {
    return null;
}

$addr = $user->getAddress();
if ($addr === null) {
    return null;
}

echo $user->getAddress()->country;
// PHP 8
echo $user?->getAddress()?->country;

Penulisan yang sangat singkat dibandingkan dengan versi PHP sebelumnya.

Union Types

Fitur Union Types dapat menggabungkan satu atau lebih tipe data dengan menggunakan operator | pipe. Sebagai contoh sebuah fungsi dapat menerima inputan berupa angka dalam bentuk integer dan float.

// PHP 7

/**
 * @param int|float $number
 */
function printNumber($number) {
  echo "Number: " . $number
}

printNumber('100'); // No error
// PHP 8
function printNumber(int|float $number) {
  echo "Number: " . $number
}

printNumber('100'); // TypeError exception

Attributes

Ketika melakukan dokumentasi parameter dan nilai balik umumnya developer PHP menggunakan syntax PHPDoc. Dengan PHP 8 developer dapat menggunakan syntax PHP untuk menambahkan dokumentasi atau metadata pada sebuah fungsi atau class.

// PHP 7
/**
* @Route("/api/posts/{id}", methods={"GET", "HEAD"})
*/
class User
{
// PHP 8
#[Route("/api/posts/{id}", methods: ["GET", "HEAD"])]
class User
{

String to Number Comparisons

Pada PHP 8 proses perbandingan sebuah string dengan angka lebih ketat untuk menghindari “kejutan” yang dihasilkan dari komparasi yang salah. Sebelum PHP 8 tanpa menggunakan strict comparison operator ( === ) kode berikut bernilai true.

// PHP 7
0 == ""; // true
// PHP 8
0 == ""; // false

Dapat dilihat pada PHP 8 meskipun tidak menggunakan strict comparison operator tapi nilai yang dihasilkan adalah sesuai. Berikut adalah contoh lain.

Comparison    | PHP 7  | PHP 8
------------------------------
 0 == "0"     | true   | true
 0 == "0.0"   | true   | true
 0 == "foo"   | true   | false
 0 == ""      | true   | false
42 == "   42" | true   | true
42 == "42foo" | true   | false

JIT (Just-In-Time Compilation)

JIT adalah fitur besar yang ditambahkan tim pengembang pada PHP 8. Secara sederhana konsep JIT adalah melakukan kompilasi kode program saat dijalankan (Just in Time), sehingga bagian kode yang sudah dikompilasi berjalan lebih cepat.

Sayangnya pada kasus aplikasi web JIT memang tidak memberi dampak yang terlalu signifikan. Tapi diluar itu peningkatan performa cukup menjanjikan.

Benchmark PHP 8 JIT
PHP 8 JIT benchmark (sumber: php.net)

Dengan fitur-fitur baru diatas menjadikan PHP 8 bahasa yang lebih lengkap dari sebelumnya. Namun demikian mungkin banyak framework atau CMS PHP yang masih belum mendukung PHP 8. Sehingga jangan terburu-buru untuk melakukan update versi. Tunggu beberapa bulan hingga rilis kompatibel dengan framework atau CMS populer seperti Laravel, Symfony, WordPress dan sebagainya.

Baca Juga:
Ulasan Fitur Baru di Laravel 8

Rilis lengkap PHP 8 dapat dilihat pada website resmi PHP di https://www.php.net/releases/8.0/en.php.