Có gì mới trong PHP 8

PHP 8 sẽ được chính thức phát hành vào ngày 26 tháng 11 năm 2020. Đây là một phiên bản chính mới hoàn toàn, nó sẽ có rất nhiều thay đổi mới và đột phá, cũng như nhiều tính năng mới và cải tiến về hiệu suất.

Nghe giang hồ đồn là PHP 8 sẽ có tốc độ bàn thờ so với các phiên bản trước :)

PHP 8 đang trong quá trình phát triển rất tích cực, với bản Alpha đầu tiên dự kiến phát hành ngày 25 tháng 6 năm 2020

PHP 8 có gì thay đổi

Do có nhiều sự thay đổi đột phá, nên có nhiều khả năng bạn sẽ phải thực hiện một số thay đổi trong code của mình để có thể chạy trên PHP 8.
Nếu bạn luôn cập nhật các bản phát hành mới nhất, thì việc nâng cấp cũng không quá khó, vì hầu hết các thay đổi đều được cập nhật theo trình tự trong các phiên bản trước 7.x

Và đừng lo lắng, tất cả những sự thay đổi sẽ được liệt kê trong bài viết này.

Bên cạnh việc phá vỡ các thay đổi (breaking changes), PHP 8 cũng mang đến một bộ các tính năng mới tuyệt vời như:

  • JIT compiler
  • Union types
  • Attributes
  • và một số thứ khác nữa

Các tính năng mới trong PHP 8

PHP 8 vẫn đang được phát triển, vì vậy danh sách này sẽ phát triển theo thời gian.

JIT compiler

RFC

Trình biên dịch “JIT” (Just In Time). Sẽ là một bước tiến hứa hẹn sẽ cải thiện hiệu suất đáng kể.

Để tìm hiểu thêm về JIT Compiler, bạn có thể tham khảo một vài viết khác mà tôi đã viết về nó ở đây.

Union types RFC

Do tính chất linh hoạt trong kiểu dữ liệu của PHP, do đó có rất nhiều trường hợp cần kết hợp nhiều kiểu dữ liệu. Do đó Union types sẽ hữu ích trong trường hợp này.

Union types sẽ là một tập hợp gồm 2 hay nhiều kiểu dữ liệu. Xem ví dụ sau để hiểu hơn:

1
public function foo(Foo|Bar $input): int|float;

Lưu ý: void sẽ không được sử dụng trong Union types. Vì nó cho biết là “không trả về giá trị gì cả”. Mà đã không trả về gì thì làm gì còn kiểu gì khác nữa đúng ko ^^

Hơn thế nữa, nullable có thể được sử dụng bằng cách |null hoặc bằng cách thêm ký hiệu ? vào phía trước kiểu dữ liệu khác.

1
2
3
public function foo(Foo|null $foo): void;

public function bar(?Bar $bar): void;

Attributes

RFC

Attributes (thuộc tính), thường được biết đến là annotations trong các ngôn ngữ khác, cung cấp một cách để thêm dữ liệu meta vào các class, mà không cần phải phân tích cú pháp.

Để xem nhanh, đây là một ví dụ về các thuộc tính trong sẽ như thế nào:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
use App\Attributes\ExampleAttribute;

<<ExampleAttribute>>
class Foo
{
<<ExampleAttribute>>
public const FOO = 'foo';

<<ExampleAttribute>>
public $x;

<<ExampleAttribute>>
public function foo(<<ExampleAttribute>> $bar) { }
}
1
2
3
4
5
6
7
8
9
10
<<Attribute>>
class ExampleAttribute
{
public $value;

public function __construct($value)
{
$this->value = $value;
}
}

Lưu ý: Attribute từng được đặt tên là PhpAttribute trong RFC trước đây, nhưng sau đó đã được thay đổi bằng một RFC mới.

Nếu bạn muốn tìm hiểu sâu về cách các thuộc tính hoạt động như thế nào và cách sử dụng, bạn có thể đọc thêm trong bài này https://stitcher.io/blog/attributes-in-php-8

Constructor property promotion RFC

RFC này thêm đường cú pháp để tạo các đối tượng giá trị hoặc đối tượng truyền dữ liệu. Thay vì chỉ định các thuộc tính lớp và hàm tạo cho chúng, giờ đây PHP có thể kết hợp chúng thành một.

Thay vì trước đây bạn phải khai báo khá nhiều như thế này:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Money 
{
public Currency $currency;

public int $amount;

public function __construct(
Currency $currency,
int $amount,
) {
$this->currency = $currency;
$this->amount = $amount;
}
}

Thì bây giờ bạn có thể đơn giản hóa bằng:

1
2
3
4
5
6
7
class Money 
{
public function __construct(
public Currency $currency,
public int $amount,
) {}
}

Có rất nhiều thứ để nói về vấn đề này, hôm nào rảnh mình sẽ viết một bài để giải thích kỹ hơn.

Trả về kiểu New static

RFC

Mặc dù đã có thể trả về self, nhưng static không phải là kiểu trả về hợp lệ cho đến phiên bản PHP 8.

Với bản chất được gõ động của PHP, đây là một tính năng sẽ hữu ích cho nhiều nhà phát triển.

1
2
3
4
5
6
7
class Foo
{
public function test(): static
{
return new static();
}
}

Kiểu dữ liệu mixed mới

RFC

Một số người có thể gọi nó là một điều ác cần thiết: mixed loại khiến nhiều người có cảm xúc lẫn lộn. Có một lý lẽ rất hay để đưa ra mặc dù: một kiểu thiếu có thể có nghĩa là rất nhiều thứ trong PHP:

  • Hàm trả về không có gì hoặc null
  • Chúng tôi đang mong đợi một trong nhiều loại
  • Chúng tôi đang mong đợi một loại không thể được gợi ý trong PHP

Vì những lý do trên, đây là một điều tốt khi mixed loại được thêm vào. mixed chính nó có nghĩa là một trong những loại sau:

  • array
  • bool
  • callable
  • int
  • float
  • null
  • object
  • resource
  • string

Lưu ý rằng mixed cũng có thể được sử dụng làm loại tham số hoặc thuộc tính, không chỉ là loại trả về.

Cũng lưu ý rằng vì mixed đã bao gồm null, nó không được phép biến nó thành nullable. Sau đây sẽ gây ra lỗi:

1
2
// Fatal error: Mixed types cannot be nullable, null is already part of the mixed type.
function bar(): ?mixed {}

Throw expression

RFC

RFC này thay đổi throw từ một statement thành một expression, điều này cho phép ném ngoại lệ ở nhiều nơi mới:

1
2
3
$triggerError = fn () => throw new MyError();

$foo = $bar['offset'] ?? throw new OffsetDoesNotExist('offset');

Cho phép sử dụng ::class trên các đối tượng

RFC

Một tính năng mới, nhỏ nhưng hữu ích: giờ đây có thể sử dụng ::class trên các đối tượng, thay vì phải sử dụng get_class() trên chúng. Nó hoạt động tương tự như get_class().

1
2
3
$foo = new Foo();

var_dump($foo::class);

Breaking changes

# ,
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×