PHP 8 đã phát hành – Những thay đổi và tính năng mới


Ngày 26/11/2020, PHP 8 đã chính thức phát hành. Hãy cùng vinasupport.com điểm qua những thay đổi và tính năng mới của PHP 8 so với PHP 7 nhé!

Giới thiệu về PHP 8

PHP 8.0 là một bản cập nhật lớn của ngôn ngữ PHP. Nó chứa nhiều tính năng và tối ưu hóa mới bao gồm các đối số được đặt tên (named arguments), kiểu liên hợp (union types), thuộc tính (attributes), quảng bá thuộc tính phương thức khởi tạo (constructor property promotion), biểu thức match, toán tử nullsafe, JIT và các cải tiến trong kiểu hệ thống, xử lý lỗi và tính nhất quán.

Những thay đổi của PHP 8 so với PHP 7

Name Arguments / Đối số được đặt tên

  • Chỉ xác định các thông số bắt buộc, bỏ qua các thông số tùy chọn.
  • Các lập luận không phụ thuộc vào trật tự và tự ghi lại.

PHP 7:

htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, 'UTF-8', false);

PHP 8:

htmlspecialchars($string, double_encode: false);

Attributes / Thuộc tính

Thay vì chú thích PHPDoc, giờ đây bạn có thể sử dụng siêu dữ liệu có cấu trúc với cú pháp gốc của PHP.

PHP 7:

class PostsController
{
    /**
     * @Route("/api/posts/{id}", methods={"GET"})
     */
    public function get($id) { /* ... */ }
}

PHP 8:

class PostsController
{
    #[Route("/api/posts/{id}", methods: ["GET"])]
    public function get($id) { /* ... */ }
}

Constructor property promotion / Quảng bá thuộc tính của Constructor

Code định nghĩa ngắn hơn để khởi tạo thuộc tính.

PHP 7:

class VinaSupport {
  public float $x;
  public float $y;
  public float $z;

  public function __construct(
    float $x = 0.0,
    float $y = 0.0,
    float $z = 0.0,
  ) {
    $this->x = $x;
    $this->y = $y;
    $this->z = $z;
  }
}

PHP 8:

class VinaSupport {
  public function __construct(
    public float $x = 0.0,
    public float $y = 0.0,
    public float $z = 0.0,
  ) {}
}

Union types

Thay vì các chú thích PHPDoc cho sự kết hợp của các kiểu, bạn có thể sử dụng các khai báo kiểu liên minh gốc được validate Runtime

PHP 7:

class Number {
  /** @var int|float */
  private $number;

  /**
   * @param float|int $number
   */
  public function __construct($number) {
    $this->number = $number;
  }
}

new Number('NaN'); // Ok

PHP 8:

class Number {
  public function __construct(
    private int|float $number
  ) {}
}

new Number('NaN'); // TypeError

Match expression / Biểu thức Match

Biểu thức Match tương tự như Switch và có các tính năng sau:

  • Match một biểu thức, có nghĩa là kết quả của nó có thể được lưu trữ trong một biến hoặc được trả về.
  • Các nhánh so khớp chỉ hỗ trợ các biểu thức một dòng và không cần break; và statement
  • Match không so sánh chặt chẽ.

PHP 7:

switch (8.0) {
  case '8.0':
    $result = "Oh no!";
    break;
  case 8.0:
    $result = "This is what I expected";
    break;
}
echo $result;
//> Oh no!

PHP 8:

echo match (8.0) {
  '8.0' => "Oh no!",
  8.0 => "This is what I expected",
};
//> This is what I expected

Nullsafe operator / Phép toán Nullsafe

Thay vì điều kiện kiểm tra null, bây giờ bạn có thể sử dụng chuỗi lệnh gọi với toán tử nullsafe mới. Khi đánh giá một phần tử trong chuỗi không thành công, quá trình thực thi của toàn bộ chuỗi sẽ bị hủy bỏ và toàn bộ chuỗi được đánh giá là null.

PHP 7:

$country =  null;

if ($session !== null) {
  $user = $session->user;

  if ($user !== null) {
    $address = $user->getAddress();
 
    if ($address !== null) {
      $country = $address->country;
    }
  }
}

PHP 8:

$country = $session?->user?->getAddress()?->country;

Saner string to number comparisons / So sánh chuỗi Saner với số

Khi so sánh với một chuỗi số, PHP 8 sử dụng phép so sánh số. Nếu không, nó chuyển đổi số thành chuỗi và sử dụng so sánh chuỗi.

PHP 7:

0 == 'foobar' // true

PHP 8:

0 == 'foobar' // false

Consistent type errors for internal functions / Lỗi loại nhất quán cho các function nội bộ

Hầu hết các function nội bộ hiện ném một ngoại lệ Lỗi nếu việc xác nhận các tham số không thành công.

PHP 7:

strlen([]); // Warning: strlen() expects parameter 1 to be string, array given

array_chunk([], -1); // Warning: array_chunk(): Size parameter expected to be greater than 0

PHP 8:

strlen([]); // TypeError: strlen(): Argument #1 ($str) must be of type string, array given

array_chunk([], -1); // ValueError: array_chunk(): Argument #2 ($length) must be greater than 0

Nguồn tham khảo: https://www.php.net/releases/8.0/en.php

             
SHARE

Bài viết liên quan

mode_edit Bình luận của bạn

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

account_circle
web