PHP 8.2 được phát hành vào ngày 8 tháng 12 năm 2022 là một bản cập nhập mới nhất của ngôn ngữ PHP. Với sự thay đổi lớn khi nó chứa nhiều tính năng mới như readonly class, null, false và true như một type độc lập, ...
Readonly class
Mặc dù PHP 8.1 đã thêm hỗ trợ cho các thuộc tính readonly (chỉ đọc). Tuy nhiên, vẫn không dễ để khai báo các lớp bất biến, đặc biệt nếu chúng chứa nhiều thuộc tính. Do đó, PHP 8.2 đã bổ sung readonly classes
Như ở phiên bản PHP 8.1
class BlogData
{
public readonly string $title;
public readonly Status $status;
public function __construct(string $title, Status $status)
{
$this->title = $title;
$this->status = $status;
}
}
Bây giơ trong phiên bản PHP 8.2, chúng ta có thể viết như sau
readonly class BlogData
{
public string $title;
public Status $status;
public function __construct(string $title, Status $status)
{
$this->title = $title;
$this->status = $status;
}
}
Chú ý: Readonly class vẫn có thể extend, nhưng lớp con cũng phải là readonly class.
Disjunctive Normal Form (DNF) Types
Disjunctive Normal Form (DNF) là một tiêu chuẩn để tổ chức các biểu thức boolean, trong PHP 8.2 cho phép chúng ta kết hợp giữa Union và Intersection trong cùng biểu thức
Ở phiên bản PHP 8.1
class Foo {
public function bar(mixed $entity) {
if ((($entity instanceof A) && ($entity instanceof B)) || ($entity === null)) {
return $entity;
}
throw new Exception('Invalid entity');
}
}
Trong phiên bản PHP 8.2
class Foo {
public function bar((A&B)|null $entity) {
return $entity;
}
}
Chú ý cần phẩn nhóm trong dấu ngoặc khi kết hợp union và intersection.
Cho phép null, false, true như một kiểu hợp lệ
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ệ, không bị lỗi.
Thông thường, trong các phiên bản trước PHP sẽ trả về false với các hàm có sẵn có khi có lỗi xẫy ra.
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. như là trong file_get_contents:
file_get_contents(/* … */):
Kết quả trả về sẽ là string hoặc false
Trước phiên bản PHP 8.2
class Falsy
{
public function almostFalse(): bool { /* ... */ *}
public function almostTrue(): bool { /* ... */ *}
public function almostNull(): string|null { /* ... */ *}
}
Bây giờ
class Falsy
{
public function alwaysFalse(): false { /* ... */ *}
public function alwaysTrue(): true { /* ... */ *}
public function alwaysNull(): null { /* ... */ *}
}
Thêm phần mở rộng Random
PHP 8.2 đã thêm vào một phần mở rộng giúp tạo ra số ngẫu nhiên để giúp giải quyết nhược điểm ở các phiên bản trước.
Trong Class \Random\Randomizer ở phiên bản mới sẽ giúp bạn tạo nhanh một số ngẫu nhiên, hay chuỗi ngẫu nhiên thay thế cho rand - random number generator , Ví dụ:
use Random\Engine\Xoshiro256StarStar;
use Random\Randomizer;
$blueprintRng = new Xoshiro256StarStar(
hash('sha256', "Example seed that is converted to a 256 Bit string via SHA-256", true)
);
$fibers = [];
for ($i = 0; $i < 8; $i++) {
$fiberRng = clone $blueprintRng;
// Xoshiro256**'s 'jump()' method moves the blueprint ahead 2**128 steps, as if calling
// 'generate()' 2**128 times, giving the Fiber 2**128 unique values without needing to reseed.
$blueprintRng->jump();
$fibers[] = new Fiber(function () use ($fiberRng, $i): void {
$randomizer = new Randomizer($fiberRng);
echo "{$i}: " . $randomizer->getInt(0, 100), PHP_EOL;
});
}
// The randomizer will use a CSPRNG by default.
$randomizer = new Randomizer();
// Even though the fibers execute in a random order, they will print the same value
// each time, because each has its own unique instance of the RNG.
$fibers = $randomizer->shuffleArray($fibers);
foreach ($fibers as $fiber) {
$fiber->start();
}
Sử dụng hằng số trong traits
Trong phiên bản PHP 8.2 bạn có thể thêm hằng số vào trong các trait
trait Foo
{
public const CONSTANT = 1;
}
class Bar
{
use Foo;
}
var_dump(Bar::CONSTANT); // 1
var_dump(Foo::CONSTANT); // Error
Chú ý: Không thể truy cập hằng số thông qua trait mà phải truy cập hằng số đó thông qua class sử dụng trait đó
Không chấp nhận thuộc tính động
Deprecate dynamic properties - Không chấp nhận thuộc tính động
Với các phiên bản PHP 8.1, khi ghi vào một thuộc tính chưa được khai báo, PHP sẽ âm thầm tạo một thuộc tính động để thay thế.
Trong PHP 8.2 sẽ cảnh báo không dùng nữa (Deprecated notice) và tuy nhiên vẫn cho phép tạo thuộc tính động. Để hiểu rõ bạn xem ví dụ:
class User {
public $name;
}
$user = new User;
// Gán thuộc tính đã khai báo User::$name.
$user->name = "foo";
$user->nane = "foo";
// PHP <= 8.1: âm thầm tạo thuộc tính
// PHP 8.2: hiển thị cảnh báo không dùng nữa, nhưng vẫn tạo thuộc tính
Các phương thức __get/__set sẽ không bị ảnh hưởng bởi thay đổi này.
Hiệu suất và thay đổi khác
Phiên bản PHP 8.2 đã thêm một số cải tiến giúp hiệu suất đã được cải thiện hơn so với các phiên bản trước đó.
Ngoài ra còn rất nhiều thay đổi :
- Thêm Classes, Interfaces, và Functions như
mysqli_execute_query, mysqli::execute_query,...
- Bỏ cú pháp nội suy chuỗi ${}
utf8_encode và utf8_decode cũng khai tử
strtolower() và strtoupper() không còn hỗ trợ locale character
Chữ ký thay đổi thành một số phương thức SPL
...