Một vài thứ hay ho trong PHP 8

Hút thuốc nhiều thì hay ho mà PHP 8 cũng có nhiều thứ hay ho. =))

PHP 8 sẽ được release vào cuối tháng 11 năm nay. Và tất nhiên với những PHP Dev như chúng ta thì việc năm bắt các tính năng mới trong bản release version mới lần này là vô cùng cần thiết. Đối với bản thân mình thì mình thấy PHP 8 có rất nhiều những tính năng mới vô cùng hữu dụng.

Tuy nhiên, cũng có một điểm cần phải lưu ý đó chính là bởi vì đây là update major version. Vì vậy mà kéo theo rất nhiều những “breaking changes”. Điều này có nghĩa là nếu như app của bạn đang chạy trên PHP 5 hay PHP 7 và bạn muốn update lên PHP 8 thì bắt buộc bạn phải thực hiện một vài thay đổi trong code để app có thể chạy bình thường.

Tính năng mới

Union types

Ở trong bản PHP 7 thì việc khái báo kiểu dữ liệu cho param truyền vào function và kiểu dữ liệu trả về đã được cho phép. Tuy nhiên nếu như mình muốn function có thể trả về nhiều kiểu dữ liệu khác nhau thì sao? Tất nhiên là không được. Trong bản 8 này thì PHP đã cho phép điều đó.

public function foo(Foo|Bar $input): int|float;

Lưu ý: kiểu void sẽ không được hỗ trợ, hoặc là trả về nhiều hoặc là không trả về gì cả. Không có chuyện thích thì trả về, ko thích thôi đâu nhé. :))

Ngoài ra nếu bạn muốn param truyền vào là nullable. Bạn có thể làm theo 2 cách:

public function foo(Foo|null $foo): void;

public function bar(?Bar $bar): void;

Named arguments

Trước đây khi sử dụng function có param truyền vào thì chúng ta sẽ phải truyền param theo thứ tự. Cái khó ở đây là khi function có quá nhiều param, chúng ta sẽ phải lục lại xem mình truyền theo thứ tự như vậy đúng chưa.

Giờ đây PHP 8 đã cho phép chúng ta làm chuyện này một cách dễ hơn bằng cách chỉ định rõ tên cho giá trị truyền vào.

function foo(string $a, string $b, ?string $c = null, ?string $d = null) 
{ /* … */ }

foo(
    b: 'value b', 
    a: 'value a', 
    d: 'value d',
);

Match expression

match là anh em với switch case, nhìn ví dụ dưới đây chắc các bạn sẽ hiểu.

$result = match($input) {
    0 => 'day la 0',
    '1' => 'day la 1'
    '2', '3' => 'day la 2 va 3',
};

Constructor property promotion

Trước đây thì bạn sẽ phải khai báo property và mức truy cập của class trước khi sử dụng trong constructor.

class Money 
{
    public Currency $currency;
 
    public int $amount;
 
    public function __construct(
        Currency $currency,
        int $amount,
    ) {
        $this->currency = $currency;
        $this->amount = $amount;
    }
}

Giờ đây thì không cần nữa. Bạn có thể khai báo nhanh chóng một cách trực tiếp như sau:

class Money 
{
    public function __construct(
        public Currency $currency,
        public int $amount = 1,
    ) {}
}

Cool!!!

Allowing ::class on objects

Cái này chắc mình không cần phải giải thích 😀

$foo = new Foo();

var_dump($foo::class); // Foo

Trailing comma in parameter lists

Chắc các bạn cũng biết rằng khi khai báo mảng thì các bạn có thể khai báo thừa 1 dấu , ở phần từ cuối cùn mà không báo lỗi. Thâm chí nó còn là 1 tiêu chuẩn (convetion) khi code của một số framework/công ty.

Mảng:

[
    1,
    2,
]

Giờ đây bạn có thể làm được tương tự như vậy khi khai báo param của function.

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

Thêm 2 function mới là str_starts_with() và str_ends_with()

str_starts_with('haystack', 'hay'); // true
str_ends_with('haystack', 'stack'); // true

Breaking changes

Như mình đã nói ở đầu tiên, vì là major version nên có rất nhiều những thay đổi buộc bạn phải refactor lại code nếu muốn update lên version 8. Mình sẽ liệt kê một vài breaking changes dưới đây.

Undefined variable

Trước đây nếu bạn sử dụng một biến chưa được khai báo thì một notice (thông báo) sẽ hiện ra. Ứng dụng vẫn sẽ chạy tiếp. Tuy nhiên bây giờ thì Error exception sẽ được throw ra đấy nhé.

Undefined array index

Trước đây nếu gọi một index không tồn tại, một notice sẽ hiện ra. Còn bây giờ là warning nhé.

Division by zero

Nếu bạn chia cho 0, một DivisionByZeroError exception sẽ hiện ra thay vì một warning như trước đây.

Toán tử @ không còn hỗ trợ các fatal errors

Có lẽ ít bạn biến toán tử @ này. Thật ra trước đây mình cũng vậy cho đến khi mình vào dự án toàn dùng dấu @ không cho các thông báo lỗi được hiển thị ra. Các bạn có thể xem thêm: Error Control Operators

Tuy nhiên bây giờ nó không còn hỗ trợ fatal errors nữa đâu nhé.

Concatenation precedence

Trước đây nếu bạn viết như sau:

echo "sum: " . $a + $b;

Thì PHP sẽ ưu tiên việc nối chuỗi trước, vì vậy đoạn đó sẽ được hiển như sau:

echo ("sum: " . $a) + $b;

Tuy nhiên PHP 8 sẽ là như sau:

echo "sum: " . ($a + $b);

Stable sorting

Trước PHP 8, các thuật toán sắp xếp không ổn định. Điều này có nghĩa là thứ tự giữa các lần sắp xếp có thể sẽ không giống nhau. Trong PHP 8 thì tất cả các hàm sắp xếp thành sắp xếp ổn định.

$array = [
    'c' => 1,
    'd' => 1,
    'a' => 0,
    'b' => 0,
];
asort($array);

// Nếu là ổn định thì nó chỉ ra như sau
['a' => 0, 'b' => 0, 'c' => 1, 'd' => 1]

// Tuy nhiên trước đây thì các kết quả sau có thể được đưa ra 
['b' => 0, 'a' => 0, 'c' => 1, 'd' => 1]
['a' => 0, 'b' => 0, 'd' => 1, 'c' => 1]
['b' => 0, 'a' => 0, 'd' => 1, 'c' => 1]

Kết luận

Thực ra PHP 8 còn rất nhiều tính năng và nhiều breaking changes khác nữa. Các bạn có thể xem thêm ở link bên dưới hoặc chờ đợi bản release chính thức từ nhà phát hành nhé.

Tham khảo: https://stitcher.io/blog/new-in-php-8

Chuyên mụcPHP

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *