- vừa được xem lúc

What's new in PHP 8.2 - Có gì mới trong PHP 8.2

0 0 31

Người đăng: Chung Nguyễn Trần

Theo Viblo Asia

PHP 8.2 sẽ được phát hành vào ngày 24 tháng 11 năm 2022. Trong bài đăng này, chúng ta sẽ tìm hiểu các tính năng, cải tiến hiệu suất, thay đổi và không dùng nữa trong lần phát hành này nhé.

Readonly classes - Lớp chỉ đọc rfc

Ở phiên bản php 8.1 chúng ta có Readonly properties ở phiên bản 8.2 thêm cú pháp để làm cho tất cả các thuộc tính của class chỉ được đọc cùng một lúc.

# PHP 8.1
class Post
{ public function __construct( public readonly string $title, public readonly Author $author, public readonly string $body, public readonly DateTime $publishedAt, ) {}
} # PHP 8.2
readonly class Post
{ public function __construct( public string $title, public Author $author, public string $body, public DateTime $publishedAt, ) {}
}

Về mặt chức năng, việc tạo một lớp chỉ đọc hoàn toàn giống như việc tạo mọi thuộc tính chỉ đọc; nhưng nó cũng sẽ ngăn các thuộc tính động được thêm vào một lớp:

$post = new Post(/* … */); $post->unknown = 'wrong'; // Sẽ báo lỗi: Uncaught Error: Cannot create dynamic property Post::$unknown

Lưu ý rằng bạn chỉ có thể mở rộng từ các readonly classes nếu lớp con cũng là readonly class.

Deprecate dynamic properties - Không dùng thuộc tính động rfc

Tôi muốn nói rằng đây là một thay đổi để tốt hơn, nhưng nó sẽ ảnh hưởng một chút. Thuộc tính động không được chấp nhận trong PHP 8.2 và sẽ tạo ra lỗi ErrorException trong PHP 9.0:

class Post
{ public string $title;
} // Thuộc tính name không được khai báo và ide sẽ cảnh báo đoạn này $post->name = 'Name';

New random extension - Phần mở rộng random mới rfc

PHP 8.2 bổ sung một trình tạo số ngẫu nhiên mới để khắc phục nhiều vấn đề với phần trước: nó hoạt động hiệu quả hơn, an toàn hơn, dễ bảo trì hơn và không dựa vào trạng thái toàn cục; loại bỏ một loạt lỗi khó phát hiện khi sử dụng các hàm ngẫu nhiên của PHP.

Có một lớp mới được gọi là Randomizer, chấp nhận một randomizer engine.

$rng = $is_production ? new Random\Engine\Secure() : new Random\Engine\Mt19937(1234); // Randomizer construct với tham số là một Randomizer engine
$randomizer = new Random\Randomizer($rng);
$randomizer->shuffleString('foobar');

nulltrue, and false as standalone types rfc

PHP 8.2 bổ sung thêm ba kiểu mới là null, true và false có thể được coi là các loại hợp lệ. Các ví dụ phổ biến là các hàm tích hợp sẵn của PHP, trong đó false được sử dụng làm kiểu trả về khi xảy ra lỗi. Ví dụ trong file_get_contents:

file_get_contents(/* … */): string|false

Trước PHP 8.2, bạn đã có thể sử dụng false cùng với các kiểu khác như một liên hợp; nhưng bây giờ nó cũng có thể được sử dụng như một loại độc lập:

function alwaysFalse(): false
{ return false;
} // tương tự với null và true

Disjunctive Normal Form Types - DNF Types rfc

Các loại DNF cho phép chúng ta kết hợp union (|) and intersection (&) types, tuân theo một quy tắc nghiêm ngặt: intersection types phải được nhóm với dấu ngoặc. Trong thực tế, nó trông như thế này:

function generateSlug((HasTitle&HasId)|null $post) { if ($post === null) { return ''; } return strtolower($post->getTitle()) . $post->getId();
}

Trong trường hợp này, (HasTitle & HasId) | null là kiểu DNF.

Constants in traits rfc

Bây giờ bạn có thể sử dụng hằng số trong các trait:

trait Foo { public const CONSTANT = 1; public function bar(): int { return self::CONSTANT; }
}

Bạn sẽ không thể truy cập hằng số thông qua tên của trait, từ bên ngoài trait hoặc từ bên trong nó.

trait Foo { public const CONSTANT = 1; public function bar(): int { // không thể truy cập từ bên trong! return Foo::CONSTANT; }
} // không thể truy cập từ bên ngoài!
Foo::CONSTANT;

Tuy nhiên, bạn có thể truy cập hằng số thông qua class sử dụng trait, với điều kiện là nó công khai:

class MyClass
{ use Foo;
} MyClass::CONSTANT; // 1

Redact parameters in back traces rfc

Khi code chạy trên production thường xảy ra lỗi, chúng ta có thể dùng các dịch vụ theo dõi để phát hiện điều này và gửi chúng cho dev sửa. Thường khi lỗi phát sinh sẽ có stack traces để có thể dò tìm lỗi, nhưng nó cũng đi kèm với những thông tin nhạy cảm như biến môi trường, mật khẩu hoặc tên người dùng.

PHP 8.2 cho phép bạn đánh dấu các "tham số nhạy cảm" như vậy bằng một thuộc tính, do đó bạn không cần phải lo lắng về việc chúng được liệt kê trong stack traces khi có sự cố. Đây là một ví dụ từ RFC:

function login( string $user, #[\SensitiveParameter] string $password <- param này được đánh dấu là param nhạy cảm
) { // … throw new Exception('Error');
} // khi gọi hàm login và có lỗi
login('root', 'root'); Fatal error: Uncaught Exception: Error in login.php:8
Stack trace:
#0 login.php(11): login('root', Object(SensitiveParameterValue))
#1 {main} thrown in login.php on line 8

Fetch properties of enums in const expressions - Lấy giá trị của enum trong biểu thức hằng số rfc

enum A: string { case B = 'B'; // có thể lấy giá trị B const C = [self::B->value => self::B];
}

Không dùng chuỗi nội suy ${} rfc

PHP có một số cách để nhúng các biến trong chuỗi. RFC này không chấp nhận hai cách làm như vậy, vì chúng hiếm khi được sử dụng và thường dẫn đến nhầm lẫn:

"Hello ${world}";
Deprecated: Using ${} in strings is deprecated "Hello ${(world)}";
Deprecated: Using ${} (variable variables) in strings is deprecated

Nói rõ hơn: hai cách nội suy chuỗi phổ biến vẫn hoạt động:

"Hello {$world}";
"Hello $world";

Không dùng utf8_encode()utf8_decode() rfc RFC gợi ý sử dụng mb_convert_encoding() để thay thế

strtolower()strtoupper() không còn hỗ trợ locale characters ví dụ như umlaut-a (ä) nếu muốn hỗ trợ bạn hãy dùng mb_strtolower()

Xem bản đẹp tại: https://chungnguyen.xyz/posts/what-s-new-in-php-8-2

Bình luận

Bài viết tương tự

- vừa được xem lúc

Cài đặt WSL / WSL2 trên Windows 10 để code như trên Ubuntu

Sau vài ba năm mình chuyển qua code trên Ubuntu thì thật không thể phủ nhận rằng mình đã yêu em nó. Cá nhân mình sử dụng Ubuntu để code web thì thật là tuyệt vời.

0 0 374

- vừa được xem lúc

Phân quyền đơn giản với package Laravel permission

Như các bạn đã biết, phân quyền trong một ứng dụng là một phần không thể thiếu trong việc phát triển phần mềm, dù đó là ứng dụng web hay là mobile. Vậy nên, hôm nay mình sẽ giới thiệu một package có thể giúp các bạn phân quyền nhanh và đơn giản trong một website được viết bằng PHP với framework là L

0 0 420

- vừa được xem lúc

Sử dụng Swagger để xây dựng API documentation

Giới thiệu về Swagger. RESTful API là một tiêu chuẩn dùng trong việc thiết kế API cho các ứng dụng web (thiết kế Web services) để tiện cho việc quản lý các resource.

0 0 1k

- vừa được xem lúc

So sánh Interface và Abstract trong lập trình hướng đối tượng.

Tổng quan. Interface và Abstract class là 2 khái niệm cơ bản trong lập trình OOP.

0 0 48

- vừa được xem lúc

CURL và cách sử dụng trong PHP

Giới Thiệu. CURL là bộ thư viện được sử dụng để giúp thực hiện việc chuyển dữ liệu thông qua nhiều giao thức khác nhau (như HTTP, FPT...). Với giao thức HTTP, cURL hỗ trợ việc gửi dữ liệu sử dụng tất cả các phương thức hiện có như GET, POST, PUT, DELETE... cURL cũng hỗ trợ việc chuyền dữ liệu sử dụn

0 0 77

- vừa được xem lúc

Thêm dòng dữ liệu mới (MySQL) trong Laravel

Chào các bạn, Laravel hiện đang là hot trend trong "thế giới PHP". 1. Cấu hình cơ bản ban đầu. .

0 0 38