PHP 8 telah dirilis pada tanggal 26 november 2020, menurut pihak RFC ada banyak perbaikan dan fitur yang ditambahkan pada versi utama PHP ini.
Daftar Isi
- Properties di Constructors
- Union Types 2.0
- Trailing Comma dalam Daftar Parameter
- ::class syntax on objects
- Abstract Method Signature Validation in Traits
- Incompatible Method Signatures
- Arrays Starting With Negative Index
- Consistent Type Errors for Internal Functions
- ‘throw’ Expression
- Weakmap
- Non-capturing catches
- The nullsafe Operator
- Named arguments
- Match expression
- New ‘static’ return type
- New Stringable Interface
- New str_contains Function
- Fungsi baru str_starts_with() dan str_ends_with()
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()