Skip to main content

Có gì mới trong PHP 8.1?

PHP 8.1 hiện đang được phát triển và sẽ được phát hành vào ngày 25 tháng 11 năm 2021. Hãy nhớ rằng ngày này vẫn có thể thay đổi  tùy theo team lập trình, chẳng hạn, thêm một bản phát hành beta bổ sung. Chúng tôi đã biết trước về các tính năng mới, sự cải tiến hiệu suất, các thay đổi ... trong phiên bản PHP 8.1 mới này. Bây giờ chúng ta đi qua từng cái một

Những đặc trưng mới

Mỗi phiên bản mới PHP luôn cho chúng ta những đặc trưng về các tính năng mới, bạn có thể theo dõi qua các lần phát triển của nó.

Enums

Enums sẽ được thêm vào trong PHP 8.1! Nếu bạn không chắc chúng có thể được sử dụng để làm gì, bạn có thể đọc về chúng tại đây.

Việc thêm enums sẽ là một cải tiến đáng kể trong PHP, vì vậy, tôi rất mong đợi được thấy enums xuất hiện trong PHP 8.1.

Để cung cấp cho bạn một bản xem trước nhanh về chúng sẽ trông như thế nào, đây là một ví dụ:

enum Status {
  case Pending;
  case Active;
  case Archived;
}

Và đây là cách chúng sẽ được sử dụng:

class Post
{
    public function __construct(
        private Status $status = Status::Pending;
    ) {}

    public function setStatus(Status $status): void
    {
        // …
    }
}

$post->setStatus(Status::Active);

Fibers

Fibers - hay còn gọi là "Green threads" - là một cơ chế cấp thấp để quản lý song song. Có thể bạn sẽ không sử dụng chúng trực tiếp trong các ứng dụng của mình, nhưng các framework như Amphp và ReactPHP sẽ sử dụng rộng rãi chúng.

Đây là một ví dụ đơn giản về việc sử dụng Fibers:

$fiber = new Fiber(function (): void {
    $valueAfterResuming = Fiber::suspend('after suspending');
    
    // … 
});
 
$valueAfterSuspending = $fiber->start();
 
$fiber->resume('after resuming');

Hiệu quả về tốc độ được cải thiện

Phiên bản PHP 8.1 đã thêm một số cải tiến cho opcache, và gọi nó là "bộ nhớ đệm kế thừa". Tính năng này cho phép các liên kết giữa các class được lưu vào bộ nhớ đệm, giống như các class được liên kết có thể được tải trước kể từ PHP 7.4.

Báo cáo về hiệu suất tăng từ 5% đến 8% nhờ sự thay đổi này, một chi tiết nhỏ đáng chú ý trong PHP 8.1.

Giải nén mảng bằng các phím chuỗi

Giải nén mảng( Array unpacking) đã được cho phép trong PHP 7.4, nhưng nó chỉ hoạt động với các phím số. Lý do các khóa chuỗi không được hỗ trợ trước đây là vì không có bất kỳ sự đồng thuận nào về cách hợp nhất các bản sao của mảng. RFC giải quyết vấn đề này một cách rõ ràng bằng cách tuân theo ngữ nghĩa của array_merge

$array1 = ["a" => 1];

$array2 = ["b" => 2];

$array = ["a" => 0, ...$array1, ...$array2];

new trong initializers

RFC này cho phép bạn sử dụng từ khóa new trong các định nghĩa hàm như một tham số mặc định, cũng như trong các đối số thuộc tính và các vị trí khác.

class MyController {
    public function __construct(
        private Logger $logger = new NullLogger(),
    ) {}
}

Readonly properties

Các thuộc tính của class có thể được đánh dấu là readonly, nghĩa là chúng chỉ có thể được ghi một lần.

class PostData {
    public function __construct(
        public readonly string $title,
        public readonly DateTimeImmutable $date,
    ) {}
}

Cố gắng thay đổi thuộc tính readonly sau khi nó đã được khởi tạo sẽ dẫn đến lỗi:

$post = new Post('Title', /* … */);

$post->title = 'Other';

Error: Cannot modify readonly property Post::$title

First-class callable syntax

Bây giờ bạn có thể thực hiện đóng từ một có thể gọi bằng cách gọi có thể gọi đó và chuyển nó ... làm đối số của nó:

function foo(int $a, int $b) { /* … */ }

$foo = foo(...);

$foo(a: 1, b: 2);

Từ khóa never 

Loại never có thể được sử dụng để chỉ ra rằng một hàm sẽ thực sự dừng dòng chương trình. Điều này có thể được thực hiện bằng cách ném một ngoại lệ, gọi exit hoặc các hàm tương tự khác.

function dd(mixed $input): never
{
    // dump
    
    exit;
}

never khác với void ở chỗ void vẫn cho phép chương trình tiếp tục. Đây có vẻ như là một tính năng mới lạ nhưng nó thực sự là một tính năng khá hữu ích cho các máy phân tích tĩnh.

array_is_list function

Có lẽ bạn đã phải giải quyết vấn đề này một lần: xác định xem các khóa của mảng có theo thứ tự số hay không, bắt đầu từ chỉ số 0. Cũng giống như json_encode quyết định xem một mảng nên được mã hóa dưới dạng mảng hay đối tượng.

PHP 8.1 thêm một hàm tích hợp để xác định xem một mảng có phải là một danh sách với những ngữ nghĩa đó hay không:

$list = ["a", "b", "c"];

array_is_list($list); // true

$notAList = [1 => "a", 2 => "b", 3 => "c"];

array_is_list($notAList); // false

$alsoNotAList = ["a" => "a", "b" => "b", "c" => "c"];

array_is_list($alsoNotAList); // false

Final class constants

Class constants trong PHP có thể bị ghi đè trong quá trình kế thừa:

class Foo
{
    public const X = "foo";
}
 
class Bar extends Foo
{
    public const X = "bar";
}

Kể từ PHP 8.1, bạn có thể đánh dấu các hằng số là final để ngăn điều này:

class Foo
{
    final public const X = "foo";
}
 
class Bar extends Foo
{
    public const X = "bar";
    
Fatal error: Bar::X cannot override final constant Foo::X

}

Ngoài ra còn rất nhiều thay đổi nhỏ nữa bạn có thể xem tại đây