ahmadajah03 Sat Dec 2020 1 year ago

Fitur Baru pada PHP 8

PHP 8 telah dirilis pada tanggal 26 november 2020, menurut pihak RFC ada banyak perbaikan dan fitur yang ditambahkan pada versi utama PHP ini.

Properties di Constructors

Anda mungkin melihat properti yang dalam bahasa seperti kotlin. Properti yang memungkinkan deklarasi properti kelas dan tugas konstruktor langsung dari konstruktor.

 

Jadi pertimbangkan contoh ini:

class Example 
{
    private string $name;
    public function __construct(string $name) {
        $this->name = $name;
    }
}

Sekarang dengan properti yang dipromosikan, Anda dapat menulis ini sebagai gantinya:

class Example 
{
    public function __construct(private string $name) {}
}

Dan Anda dapat mengakses $this->name dengan cara biasa dengan metode apa pun seperti yang Anda lakukan dengan properti normal.

Union Types 2.0

Jenis gabungan akan ditambahkan dalam PHP 8 yang memungkinkan untuk menentukan beberapa jenis properti, parameter fungsi, dan jenis kembalian.

class Example {
    private int|float $number1;

    public function calc(float|int $number2): int|float {
        return $this->number1 + $number2;
    }
}

Trailing Comma dalam Daftar Parameter

Tanda koma adalah koma yang ditambahkan ke daftar item dalam konteks berbeda. Dalam PHP 7.2 ada tertinggal koma dalam daftar sintaks, PHP 7.3 memperkenalkan t pagar koma dalam panggilan fungsi. Sekarang di PHP 8 akan memperkenalkan tanda koma dalam daftar parameter dalam metode, fungsi, dan penutupan.

public function(
    string $parameterA,
    int $parameterB,
    Foo $objectfoo,
) {
    // …
}

::class syntax on objects

Untuk mendapatkan nama kelas pada objek sebelum PHP 8 kita bisa menggunakan get_class($object). Di PHP 8 kita bisa menggunakan $object::class untuk mendapatkan nama kelas.

$object = new stdClass;
var_dump($object::class);   // "stdClass"

Abstract Method Signature Validation in Traits

Ada peningkatan baru saat menggunakan metode abstrak dalam sifat, sebelum PHP 8 Anda dapat menulis sesuatu seperti ini:

trait Test {
    abstract public function test(int $input): int;
}
class UsesTrait
{
    use Test;
    public function test($input)
    {
        return $input;
    }
}

Perhatikan bahwa saat mengimplementasikan metode test() kita menghilangkan tipe parameter dan tipe kembalian. Tetapi PHP 8 akan melakukan validasi tanda tangan metode yang tepat saat menggunakan suatu sifat dan mengimplementasikan metode abstraknya, jadi contoh di atas akan seperti ini:

trait Test {
    abstract public function test(int $input): int;
}

class UsesTrait
{
    use Test;

    public function test(int $input) : int
    {
        return $input;
    }
}

Incompatible Method Signatures

Di PHP, kesalahan pewarisan karena tanda tangan metode yang tidak kompatibel menimbulkan kesalahan fatal atau peringatan tergantung pada apa yang menyebabkan kesalahan.

class Foo {
    public function process(stdClass $item): array{}
}

class SuperFoo extends Foo{
    public function process(array $items): array{}
    //                      ^^^^^ mismatch
}

Jika Anda menjalankan cuplikan ini, peringatan ini akan muncul:

Warning: Declaration of SuperFoo::process(array $items): array should be compatible with Foo::process(stdClass $item): array in ... on line ...

Di PHP 8, ketidakcocokan tanda tangan seperti itu mengakibatkan kesalahan fatal.

Fatal error: Declaration of SuperFoo::process(array $items): array must be compatible with Foo::process(stdClass $item): array in ... on line ...

Arrays Starting With Negative Index

Lihat contoh ini:
$a = array_fill(-5, 4, true);
var_dump($a);

Kode ini akan menampilkan:

array(4) {
    [-5]=>
    bool(true)
    [0]=>
    bool(true)
    [1]=>
    bool(true)
    [2]=>
    bool(true)
}

Sekarang di php 8 array yang dimulai dengan indeks negatif akan diubah sehingga indeks kedua akan menjadi start_index + 1, berapapun nilainya start_index. Jadi di php 8 kode ini akan menampilkan:

array(4) {
    [-5]=>
    bool(true)
    [-4]=>
    bool(true)
    [-3]=>
    bool(true)
    [-2]=>
    bool(true)
}

Consistent Type Errors for Internal Functions

Saat meneruskan parameter jenis ilegal, fungsi internal dan yang ditentukan pengguna berperilaku berbeda. Fungsi yang ditentukan pengguna menampilkan TypeError, tetapi fungsi internal berperilaku dalam berbagai cara, bergantung pada beberapa kondisi, misalnya:

var_dump(strlen(new stdClass));

Contoh ini akan menghasilkan:

Warning: strlen() expects parameter 1 to be string, object given in /path/to/your/test.php on line 4
NULL

Dalam PHP 8, contoh ini menampilkan kesalahan berikut:

Fatal error: Uncaught TypeError: strlen(): Argument #1 ($str) must be of type string, object given in /path/to/your/test.php:4
Stack trace:
#0 {main}
  thrown in /path/to/your/test.php on line 4

‘throw’ Expression

Dalam PHP, throw adalah pernyataan, jadi tidak mungkin menggunakannya di tempat di mana hanya ekspresi yang diperbolehkan. Dalam PHP 8, lemparan akan diubah menjadi ekspresi misalnya dapat digunakan dalam fungsi panah, operator penggabungan nol, operator terner dan elvis, dll.

$callable = fn() => throw new Exception();

// $value is non-nullable.
$value = $nullableValue ?? throw new InvalidArgumentException();
 
// $value is truthy.
$value = $falsableValue ?: throw new InvalidArgumentException();

Weakmap

Sebuah WeakMap implementasi ditambahkan dalam PHP 8. WeakMap memegang referensi ke obyek, yang tidak mencegah benda-benda dari yang sampah yang dikumpulkan.

$map = new WeakMap;
$obj = new stdClass;
$map[$obj] = 42;
var_dump($map);

Non-capturing catches

Sebelum PHP 8 kapan pun Anda ingin menangkap pengecualian sebelum PHP 8, Anda harus menyimpannya dalam variabel, terlepas dari apakah Anda menggunakan variabel itu atau tidak.

try {
    // Something goes wrong
} catch (MySpecialException $exception) {
    Log::error("Something went wrong");
}

Sekarang Anda bisa melakukan ini:

try {
    // Something goes wrong
} catch (MySpecialException) {
    Log::error("Something went wrong");
}

The nullsafe Operator

Dengan tambahan nullsafe operator, kita sekarang dapat memiliki perilaku seperti penggabungan nol pada metode!

$dateAsString = $booking->getStartDate()?->asDateTimeString();

Named arguments

Jika Anda sudah familiar dengan Ecmascript 6 mungkin Anda mungkin melihat sesuatu seperti argumen bernama. Argumen bernama memungkinkan Anda meneruskan nilai ke suatu fungsi, dengan menentukan nama nilainya, sehingga Anda tidak perlu mempertimbangkan urutannya, dan Anda juga dapat melewati parameter opsional!

function foo(int $a, float $b, ?string $c = null, ?string $d = null) 
{ /* … */ }
foo(
    b: 2, 
    a: 2.5, 
    d: 'john',
);

Match expression

Match expression seperti klasik switch pernyataan tapi lebih pendek. match dapat mengembalikan nilai, tidak memerlukan breakpernyataan, dapat menggabungkan kondisi, menggunakan perbandingan tipe yang ketat dan tidak melakukan pemaksaan tipe apa pun.

$result = match($input) {
    0 => "hello",
    '1', '2', '3' => "world",
};

New ‘static’ return type

static bukanlah tipe pengembalian yang valid sampai PHP 8. Mengingat sifat PHP yang diketik secara dinamis, ini adalah fitur yang akan berguna bagi banyak pengembang.

class Foo
{
    public function test(): static
    {
        return new static();
    }
}

New Stringable Interface

The Stringable interface dapat digunakan untuk mengetik petunjuk apa pun yang mengimplementasikan __toString(). Setiap kali kelas diimplementasikan __toString(), secara otomatis mengimplementasikan antarmuka di belakang layar

class Foo
{
    public function __toString(): string
    {
        return 'foo';
    }
}
function bar(string|Stringable $stringable) { /* … */ }
bar(new Foo());
bar('abc');

New str_contains Function

Seperti strpos() fungsi untuk mengetahui apakah suatu string berisi string lain.

 

Daripada melakukan ini:

if (strpos('string with lots of words', 'words') !== false) { /* … */ }

Sekarang Anda bisa melakukan ini

if (str_contains('string with lots of words', 'words')) { /* … */ }

Fungsi baru str_starts_with() dan str_ends_with()

str_starts_with('hello world', 'hel'); // true
str_ends_with('hello world', 'orld'); // true

Fitur Lain Juga Termasuk:

  • JIT (Just In-time Compiler)
  • Atribut (Annotations in other languages)
  • Jenis 'mixed' baru
  • Buat objek DateTime dari antarmuka
  • get_debug_type()
  • get_resource_id()
php new fitur php 8