× Giới thiệu Lịch khai giảng Tin tức Sản phẩm học viên

Tính năng mới của PHP 8.0 - Phiên bản tối ưu và hiệu suất

16/04/2021 02:22

(Tính năng mới của PHP 8.0 PHP) - Ngôn ngữ kịch bản phía máy chủ này được sử dụng với HTML để chăm sóc cơ sở dữ liệu, phiên, nội dung động và nhiều thứ khác. PHP có kết nối với các cơ sở dữ liệu như MySQL, Oracle và Informix, ...Nó rất linh hoạt đến mức ngay cả những truy vấn phức tạp cũng có thể được chạy trong thời gian ngắn hơn và hiệu quả hơn.  PHP 8 được phát hành vào ngày 26/11/2020, đây là phiên bản mới nhất với nhiều tính năng đột phá, cũng như nhiều tính năng mới và cải tiến. Cùng T3H điểm qua các tính năng mới của PHP 8 trong năm nay bạn nhé!

Tính năng mới của PHP 8.0

Tìm hiểu một số tính năng mới của PHP 8.0

Union Types - Tính năng mới của PHP 8.0

Với bản chất được định kiểu động của PHP, có rất nhiều trường hợp mà kiểu liên hợp (union types) có thể hữu ích.

Các union types là một tập hợp của hai hoặc nhiều kiểu cho biết rằng một trong hai kiểu đó có thể được sử dụng.

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

 Lưu ý rằng void không bao giờ có thể là một phần của union type, vì nó chỉ ra 'không có giá trị trả lại nào cả'. Hơn nữa, nullable có thể được viết bằng cách sử dụng |null, hoặc bằng cách sử dụng ký hiệu ?:

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

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

 JIT

Trình biên dịch JIT - Just-in-time Compiler hứa hẹn cải thiện hiệu suất đáng kể, mặc dù không phải lúc nào là ưu tiên hàng đầu của website.

Toán tử nullsafe - Tính năng mới của PHP 8.0

Nếu bạn đã quen thuộc với toán tử liên hợp null thì bạn đã quen với những yếu điểm của nó. Nó không hoạt động trên các method call. Thay vào đó, bạn cần kiểm tra trung gian hoặc dựa vào các trình trợ giúp tùy chọn được cung cấp bởi một số framework, ví dụ như sau:

$startDate = $booking->getStartDate();

$dateAsString = $startDate ? $startDate->asDateTimeString() : null;

 Với việc bổ sung toán tử nullsafe, bây giờ chúng ta có thể có hành vi giống như toán tử liên hợp null trên các phương thức!

$dateAsString = $booking->getStartDate()?->asDateTimeString();

 Đặt tên cho đối số - Tính năng mới của PHP

Các đối số được đặt tên cho phép bạn chuyển các giá trị vào một hàm, bằng cách chỉ định tên giá trị, do đó bạn không phải xem xét thứ tự của chúng và bạn cũng có thể bỏ qua các tham số tùy chọn!

function foo(string $a, string $b, ?string $c = null, ?string $d = null) 

{ /* … */ }

foo(

    b: 'value b', 

    a: 'value a', 

    d: 'value d',

);

 Các thuộc tính mới trong PHP

Các thuộc tính cũng là một trong những tính năng mới của PHP 8.0, thường được gọi là chú thích 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 lớp mà không cần phải phân tích cú pháp docblocks.

Dưới đây là một ví dụ về các thuộc tính trông như thế nào, từ RFC:

#[ExampleAttribute]

class Foo

{

    #[ExampleAttribute]

    public const FOO = 'foo';

     #[ExampleAttribute]

    public $x;

     #[ExampleAttribute]

    public function foo(#[ExampleAttribute] $bar) { }

}

 #[Attribute]

class ExampleAttribute

{

    public $value;

     public function __construct($value)

    {

        $this->value = $value;

    }

}

Lưu ý là base Attribute này từng được gọi là PhpAttribute trong RFC gốc, nhưng đã được thay đổi bằng RFC khác sau đấy.

>>> Đọc thêm: PHP là gì - Những lợi ích của việc sử dung ngôn ngữ lập trình PHP

Match Expression- Tính năng mới của PHP 8.0

Bạn có thể gọi nó là anh cả của biểu thức switch, match có thể trả về giá trị, không yêu cầu câu lệnh break, có thể kết hợp các điều kiện, sử dụng so sánh kiểu nghiêm ngặt và không thực hiện bất kỳ kiểu ép buộc nào.

Ví dụ như sau:

$result = match($input) {

    0 => "hello",

    '1', '2', '3' => "world",

};

 Constructor

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

Thay vì làm như thế này:

class Money

{

    public Currency $currency;

     public int $amount;

     public function __construct(

        Currency $currency,

        int $amount,

    ) {

        $this->currency = $currency;

        $this->amount = $amount;

    }

}




Bây giờ bạn có thể làm thế này trong PHP 8:

class Money

{

    public function __construct(

        public Currency $currency,

        public int $amount,

    ) {}

}

 >>> Tham khảo: Khóa học lập trình PHP

Kiểu trả về static mới

Mặc dù đã có thể tự trả về, nhưng static không phải là kiểu trả về hợp lệ cho đến PHP 8. Với bản chất dynamic type của PHP, đây là một tính năng sẽ hữu ích cho nhiều lập trình viên.

class Foo

{

    public function test(): static

    {

        return new static();

    }

}

 Kiểu mixed mới

Kiểu mixed (hỗn hợp) này có thể khiến nhiều người có cảm xúc lẫn lộn.

Tuy nhiên, có một lập luận rất tốt để giải quyết vấn đề này: Một kiểu bị thiếu có thể có nhiều ý nghĩa trong PHP:

  • Một hàm không trả về gì hoặc null
  • Chúng ta đang mong đợi một trong một số các kiểu,.....

Bởi vì những lý do trên, kiểu mixed được thêm vào là một điều tốt. Bản thân mixed có nghĩa là một trong các kiểu sau:

 

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


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

Cũng lưu ý rằng vì mixed đã bao gồm null, nên không được phép làm cho nó có giá trị rỗng. Điều sau sẽ gây ra lỗi:

// Fatal error: Mixed types cannot be nullable,

// null is already part of the mixed type.

function bar(): ?mixed {}

 Throw expression

RFC thay đổi throw từ là một câu lệnh thành một biểu thức, điều này làm cho nó có thể ném ngoại lệ ở nhiều vị trí mới:

$triggerError = fn () => throw new MyError();

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

 Kế thừa với các phương thức private

Trước đây, PHP đã từng áp dụng các kiểm tra kế thừa giống nhau trên các phương thức public, protected và private.

Nói cách khác: Các phương thức private phải tuân theo các quy tắc giống như các phương thức protected và public. Điều này không có ý nghĩa, vì các phương thức private sẽ không được các lớp con truy cập.

RFC đã thay đổi hành vi đó, để các kiểm tra kế thừa này không được thực hiện trên các phương thức private nữa.

Hơn nữa, việc sử dụng final private function cũng không có ý nghĩa, vì vậy làm như vậy bây giờ sẽ kích hoạt cảnh báo:

Warning: Private methods cannot be final as they are never overridden by other classes

Weakmap - Tính năng mới của PHP 8.0

Weakmap là một trong những tính năng mới của PHP 8.0. Được xây dựng dựa trên weakrefs RFC đã được thêm vào trong PHP 7.4, một bản triển khai WeakMap được thêm vào trong PHP 8.

WeakMap giữ các tham chiếu đến các đối tượng, điều này không ngăn các đối tượng đó bị thu thập rác.

Lấy ví dụ về ORM, chúng thường triển khai các bộ nhớ đệm chứa các tham chiếu đến các lớp thực thể để cải thiện hiệu suất của quan hệ giữa các thực thể. Không thể thu thập các đối tượng thực thể này, miễn là bộ đệm này có tham chiếu đến chúng, ngay cả khi bộ đệm là thứ duy nhất tham chiếu đến chúng.

Nếu lớp bộ nhớ đệm này sử dụng các tham chiếu và map yếu để thay thế, PHP sẽ thu thập các đối tượng này khi không có gì khác tham chiếu đến chúng nữa. Đặc biệt là trong trường hợp ORM, có thể quản lý hàng trăm, nếu không phải hàng nghìn thực thể trong một yêu cầu; weak map có thể cung cấp một cách tốt hơn, thân thiện hơn với tài nguyên để xử lý các đối tượng này.

Dưới đây cho thấy các weakmap trông như thế nào, một ví dụ từ RFC:

class Foo

{

    private WeakMap $cache;

 

    public function getSomethingWithCaching(object $obj): object

    {

        return $this->cache[$obj]

           ??= $this->computeSomethingExpensive($obj);

    }

}

 Kết luận: Trên đây là các tính năng mới nhất của PHP 8, phiên bản mới phát hàng vào tháng 11.2020. Hy vọng các bạn có thể áp dụng các tính năng mới này trong quá trình làm việc với PHP 8. Tìm hiểu thêm về PHP và các ngôn ngữ lập trình khác qua khóa học lập trình tại T3H.