Skip to main content

Có gì mới trong PHP 8.2

 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
  • ...

Bạn có thể xem các thay đổi tại đây