Phát hành ngôn ngữ lập trình PHP 8.1

Sau một năm phát triển, ngôn ngữ lập trình PHP 8.1 đã được ra mắt. Nhánh mới bao gồm một loạt tính năng mới cũng như một số thay đổi làm ảnh hưởng đến tính tương thích.

Những cải tiến chính trong PHP 8.1:

  • Đã thêm hỗ trợ cho bảng liệt kê, ví dụ: bây giờ bạn có thể sử dụng các cấu trúc sau: enum Status { case Đang chờ xử lý; trường hợp Hoạt động; trường hợp được lưu trữ; } class Post { public function __construct( Private Status $status = Status::Pending; ) {} public function setStatus(Status $status): void { // … } } $post->setStatus(Status::Active);
  • Đã thêm hỗ trợ cho các luồng nhẹ được gọi là Sợi, cho phép bạn quản lý các luồng thực thi ở mức thấp. Hỗ trợ Fiber dự kiến ​​sẽ được thêm vào khung Amphp và ReactPHP. $fiber = new Fiber(function (): void { $valueAfterResuming = Fiber::suspend('sau khi tạm dừng'); // ... }); $valueAfterSuspending = $fiber->start(); $fiber->resume('sau khi tiếp tục');
  • Việc triển khai bộ nhớ đệm mã đối tượng (opcache) đã được cải thiện, giúp có thể lưu vào bộ nhớ đệm thông tin về kế thừa lớp. Tối ưu hóa giúp tăng hiệu suất của một số ứng dụng lên 5-8%. Các tối ưu hóa khác bao gồm tối ưu hóa hoạt động JIT, triển khai hỗ trợ JIT cho kiến ​​trúc ARM64 (AArch64), tăng tốc độ phân giải tên, tối ưu hóa thư viện timelib và ext/date, tăng hiệu suất tuần tự hóa và giải tuần tự hóa, tối ưu hóa get_declared_classes(), phát nổ() , hàm strtr(), strnatcmp(), dechex(). Nhìn chung, hiệu suất tăng 23.0% đối với Symfony Demo và 3.5% đối với WordPress.
  • Toán tử giải nén bên trong mảng "...$var", cho phép thay thế các mảng hiện có khi xác định một mảng mới, đã được mở rộng để hỗ trợ các khóa chuỗi (trước đây chỉ hỗ trợ mã định danh kỹ thuật số). Ví dụ: bây giờ bạn có thể sử dụng trong mã: $array1 = [“a” => 1]; $array2 = ["b" => 2]; $array = [“a” => 0, …$array1, …$array2]; var_dump ($ mảng); // ["a" => 1, "b" => 2]
  • Được phép sử dụng từ khóa "mới" trong phần khởi tạo, chẳng hạn như trong định nghĩa hàm làm tham số mặc định hoặc trong thuộc tính đối số. lớp MyController { chức năng công khai __construct( Private Logger $logger = new NullLogger(), ) {} }
  • Có thể đánh dấu các thuộc tính lớp để truy cập chỉ đọc (thông tin trong các thuộc tính đó chỉ có thể được ghi một lần, sau đó sẽ không có sẵn để thay đổi). class PostData { public function __construct( chuỗi chỉ đọc công khai $title, public readonly DateTimeImmutable $date, ) {} } $post = new Post('Title', /* … */); $post->title = 'Khác'; > Lỗi: Không thể sửa đổi thuộc tính chỉ đọc Post::$title
  • Một cú pháp mới đã được triển khai cho các đối tượng có thể gọi được - giờ đây, một bao đóng có thể được hình thành bằng cách gọi một hàm và chuyển cho nó giá trị "..." làm đối số (tức là myFunc(...) thay vì Closure::fromCallable('myFunc ')): function foo (int $a, int $b) { /* … */ } $foo = foo(…); $foo(a: 1, b: 2);
  • Đã thêm hỗ trợ đầy đủ cho các loại giao lộ, cho phép bạn tạo các loại giao lộ mới bằng cách kết hợp các loại giao lộ hiện có. Không giống như các kiểu kết hợp, xác định các bộ sưu tập gồm hai loại trở lên, các kiểu giao nhau không yêu cầu sự hiện diện của bất kỳ loại nào được liệt kê mà là tất cả các loại được chỉ định trong tập hợp cần được điền. hàm generateSlug(HasTitle&HasId $post) { return strtower($post->getTitle()) . $post->getId(); }
  • Có một loại mới "không bao giờ" có thể được sử dụng để thông báo cho máy phân tích tĩnh rằng một hàm sẽ chấm dứt việc thực thi chương trình, chẳng hạn bằng cách đưa ra một ngoại lệ hoặc thực thi hàm thoát. hàm dd(hỗn hợp $input): không bao giờ { exit; }
  • Một hàm mới array_is_list đã được đề xuất, cho phép bạn xác định rằng các khóa trong mảng được sắp xếp theo thứ tự giá trị số tăng dần, bắt đầu từ 0: $list = [“a”, “b”, “c”]; mảng_is_list($list); // true $notAList = [1 => “a”, 2 => “b”, 3 => “c”]; mảng_is_list($notAList); // false $alsoNotAList = ["a" => "a", "b" => "b", "c" => "c"]; mảng_is_list($alsoNotAList); // SAI
  • Bây giờ bạn có thể sử dụng từ khóa "cuối cùng" để ngăn các hằng số lớp cha bị ghi đè. class Foo { công khai cuối cùng const X = "foo"; } class Bar mở rộng Foo { public const X = "bar"; > Lỗi nghiêm trọng: Bar::X không thể ghi đè hằng số cuối cùng Foo::X }
  • Các chức năng fsync và fdatasync được đề xuất để buộc các thay đổi được lưu từ bộ đệm đĩa. $file = fopen("sample.txt", "w"); fwrite($file, "Một số nội dung"); if (fsync($file)) { echo "Tệp đã được lưu thành công vào đĩa."; } fclose($file);
  • Đã thêm khả năng sử dụng tiền tố "0o" và "0O" cho số bát phân, ngoài tiền tố "0" đã sử dụng trước đó. 016 === 0o16; // đúng 016 === 0O16; // ĐÚNG VẬY
  • Người ta đề xuất hạn chế có chọn lọc việc sử dụng $GLOBALS, điều này sẽ dẫn đến vi phạm khả năng tương thích ngược, nhưng sẽ giúp tăng tốc đáng kể các hoạt động với mảng. Ví dụ: khả năng vô hiệu hóa việc ghi vào $GLOBALS và chuyển $GLOBALS bằng con trỏ đang được xem xét. Phân tích 2000 gói hàng cho thấy chỉ có 23 gói trong số đó bị ảnh hưởng bởi sự thay đổi này. Ví dụ: nếu đề xuất được phê duyệt, 8.1 sẽ không còn hỗ trợ các biểu thức như: $GLOBALS = []; $GLOBALS += []; $ TOÀN CẦU =& $x; $x =& $ TOÀN CẦU; unset($GLOBALS); by_ref($GLOBALS);
  • Các phương thức nội bộ bây giờ sẽ trả về đúng loại. Trong PHP 8.1, việc trả về một kiểu không khớp với khai báo hàm sẽ tạo ra cảnh báo, nhưng trong PHP 9.0, cảnh báo sẽ được thay thế bằng một lỗi.
  • Công việc tiếp tục chuyển các chức năng từ sử dụng tài nguyên sang thao tác đối tượng. Các hàm finfo_* và imap_* đã được chuyển sang các đối tượng.
  • Việc truyền các giá trị null làm đối số cho các hàm nội bộ được đánh dấu là không rỗng đã không còn được dùng nữa. Trong PHP 8.1, việc sử dụng các cấu trúc như str_contains("string", null) sẽ dẫn đến cảnh báo và trong PHP 9 sẽ dẫn đến lỗi.
  • Đã thêm hỗ trợ cho thuật toán băm MurmurHash3 và xxHash.

Nguồn: opennet.ru

Thêm một lời nhận xét