Toidicode.com

Toidicode.com

BASIC TO ADVANCE

Những tính năng mới trong PHP 8.1

Hôm qua (26/11/2021), PHP 8.1 đã được release với một loạt các tính năng mới như: enum, read only roperty, fibers,... và cải thiệt rất nhiều về mặt hiệu năng.

Bài viết này mình sẽ liệu kê ra một số feature mới nổi bật trong PHP 8.1

1. Enumerations.

Nếu như các bạn đã từng sử dụng các ngôn ngữ khác như: Java, C#,... thì chắc hẳn các bạn cũng biết đến enum rồi.

Enum là một kiểu dữ liệu đặc biệt, enum chứa một tập hợp các hằng số được xác định trước. Thay vì các bạn phải khai báo các const trong class như trước thì bạn có thể khai báo chúng vào một enum cho dễ quản lí.

VD: PHP < 8.1

class Status
{
    const DRAFT = 'draft';
    const PUBLISHED = 'published';
    const ARCHIVED = 'archived';
}

function acceptStatus(string $status) {...}

Giờ đây từ PHP 8.1 trở đi bạn có thể đặt nó trong enum như sau:

enum Status
{
    case Draft;
    case Published;
    case Archived;
}

function acceptStatus(Status $status) {...}

Để hiểu rõ hơn về enum trong PHP các bạn có thể tham khảo tại đây.

2. Readonly Properties.

Ở phiên bản này PHP cung cấp thêm một loại thuộc tính chỉ được phép đọc mà không được phép ghi khi class đã được khởi tạo.

Nếu bạn muốn một thuộc tính chỉ được phép đọc thì chỉ cần thêm keyword readonly vào sau visibility của thuộc tính đó.

VD: định nghĩa thuộc tính $status là readonly.

class BlogData
{
    public readonly Status $status;
}

Gán giá trị cho thuộc tính trong constructor (nếu gán giá trị ngoài phương thức __construct nó sẽ throw ra một Error exception).

class BlogData
{
    public readonly Status $status;

    public function __construct(Status $status)
    {
        $this->status = $status;
    }
}

3. First-class Callable.

Tính năng này cho phép chúng ta tham chiếu đến bất kì một hàm, phương thức nào một cách ngắn gọn. Tính năng này PHP gọi nói là  first-class callable.

VD: Đối với PHP < 8.1

class Foo
{
    public function bar(): string
    {
        return 'bar method';
    }
}

$bar = [new Foo(), 'bar'];

$bar(); // bar method

$fn = Closure::fromCallable('strlen');

$fn("ABC"); // 3

Giờ đây với PHP 8.1 bạn chỉ việc khai báo ngắn ngọn như sau;

<?php

class Foo
{
    public function bar(): string
    {
        return 'bar method';
    }
}

$bar = (new Foo())->bar(...);

$bar(); // bar method

$fn = strlen(...);

$fn("ABC"); // 3

4. Initializers.

Ở phiên bản PHP 8.1 này bạn có thể khai báo default value của parameter là một object.

VD:

class Service
{
    private Logger $logger;

    public function __construct(
        Logger $logger = new NullLogger(),
    ) {
        $this->logger = $logger;
    }
}

5. Pure Intersection Type.

Tính năng này cho phép chúng ta ràng buộc kiểu dữ liệu cho parameter một cách chặt chẽ hơn.

VD: Đối với PHP < 8.1 nếu như chúng ta muốn parameter bắt buộc phải vừa implement Interator và Countable thì sẽ phải làm như sau:

function count_and_iterate(Iterator $value) {
    if (!($value instanceof Countable)) {
        throw new TypeError('value must be Countable');
    }

    foreach ($value as $val) {
        echo $val;
    }

    count($value);
}

Nhưng giờ đây với PHP 8.1 bạn có thể sử dụng & để định nghĩa các type mong muốn. Lúc này kiểu giá trị truyền vào bắt buộc phải thỏa mãn tất cả các type đó

VD:

function count_and_iterate(Iterator&Countable $value) {
    foreach ($value as $val) {
        echo $val;
    }

    count($value);
}

6. Nerver return type.

Tính năng này cho phép chúng ta định nghĩa ra một hàm sẽ không trả về về kiểu giá trị nào và được kết thúc bằng cách gọi hàm die(), exit() hoặc throw ra một exception.

Để khai báo một hàm như thế chúng ta định nghĩa kiểu trả về của hàm là keyword never.

VD:

function redirect(string $uri): never {
    header('Location: ' . $uri);
    exit();
}

function redirectToLoginPage(): never {
    redirect('/login');
    echo 'Hello'; // Nếu khai báo như này thì code vẫn chạy nhưng các IDE inspector, static analysis sẽ báo lỗi
}

7. Final class constants.

Tính năng này cho phép chúng ta định nghĩa một const trong class ở dạng final, tức là không được phép ghi đè lại ở các class con.

VD:

class Foo
{
    final public const XX = "foo";
}

class Bar extends Foo
{
    public const XX = "bar"; // Fatal error
}

8. Fibers.

Đây là một tính năng cũng khá là vị trong PHP 8.1 lần này.

Fibers là một util thực thi bất đồng bộ trong PHP. Khi sử dụng fiber bạn có thể thực thi code một cách bất đồng bộ giống như Generators.

Bạn có thể xem qua ảnh sau để hiểu hơn về fiber.

Bạn có thể thực thi, tạm dừng, đình chỉ hoặc dừng một filber bất cứ lúc nào bạn muốn.

VD: Mình sẽ demo một ví dụ cơ bản với fiber

$fiber = new Fiber(function(): void {
    echo "Hello from the Fiber...\n";
    Fiber::suspend(); // Tạm dừng fiber
    echo "Hello again from the Fiber...\n";
});

echo "Starting the program...\n";
$fiber->start(); // chạy fiber
echo "Taken control back...\n";
echo "Resuming Fiber...\n";
$fiber->resume(); // tiếp tục thực hiện fiber
echo "Program exits...\n";

Output

Starting the program...
Hello from the Fiber...
Taken control back...
Resuming Fiber...
Hello again from the Fiber...
Program exits...

Như các bạn đã thấy thì chúng ta có thể supend một fiber bất cứ lúc nào mà không ảnh hưởng đến luồng logic chính của chương trình.

Mình sẽ nói sâu hơn về Fiber ở một bài viết cụ thể sau.

9. Array unpacking - hỗ trợ mảng bất tuần tự.

Nếu như trước đây bạn không thể unpack một mảng bất tuần tự, thì giờ đây với phiên bản PHP 8.1 bạn đã có thể làm việc đó.

VD:

$arrayA = ['a' => 1];
$arrayB = ['b' => 2];

$result = ['a' => 0, ...$arrayA, ...$arrayB];
// ['a' => 1, 'b' => 2]

10. Cải tiến về mặt hiệu năng.

Đối với phiên bản PHP 8.1 sẽ cho hiệu năng nhanh hơn ~23% trên Symfony framework và ~3.5% trên Wordpress.

Dưới đây là thông số benchmark đo được trên Symfony framework (chỉ số càng nhỏ thì là càng nhanh).

Đăng ký nhận tin.

Chúng tôi chỉ gửi tối đa 2 lần trên 1 tháng. Tuyên bố không spam mail!

Vũ Thanh Tài

About author
The best way to learn is to share
Xem tất cả bài đăng

5 Comments

Good

Truong

6 tháng trước

Nice

Truong

6 tháng trước

That's great!

Anonymous

6 tháng trước

That's great!

Anonymous

6 tháng trước

Good job, bro!

Anonymous

6 tháng trước

Bình luận

Captcha