Toidicode.com

Toidicode.com

BASIC TO ADVANCE

Những tính năng mới trong PHP 8 (phần 1)

PHP 8.0 là một bản cập nhật lớn của PHP. Nó chứa rất nhiều tính năng mới và optimize những thứ chưa tốt ở những phiên bản cũ như: named arguments, union types, attributes, constructor property promotion, match expression, nullsafe operator, JIT.

1. Named arguments.

Tính năng này cho phép chúng ta truyền thêm tên của argument khi chúng ta gọi hàm. Điều này giúp chúng ta có thể truyền tham số vào hàm mà không cần phải theo đúng thứ tự như trước nữa.

VD:

function say($lang = 'en', $message = "Hi")
{
	echo "message: " . $message . " lang:" . $lang;
}

// PHP 8

say(message: "Xin Chao");

// Output: message: Xin Chao lang:en

2. Attributes.

Bây giờ bạn có thể sử dụng anotaion một cách đơn giản hơn bằng cách sử dụng dấu #. Thay vì bắt buộc phải khai báo trong PHPDoc block như trước nữa.

VD:

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

3. Constructor property promotion.

Đây là tính năng giúp chúng ta không cần khai báo initialize properties. Mà có thể truyền và khai báo trực tiếp trong contructor.

VD: Đối với PHP 7

class Point {
  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;
  }
}

VD: PHP 8

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

Mọi người đã thấy ngắn hơn nhiều chưa?

4. Union types.

Giờ đây bạn đã có thể sự dụng nhiều kiểu dữ liệu cho thuộc tính và phương thức. Thay vì trước đây phải chú thích ở trong Doc.

VD:

class Number
{
    private int|float $number;

    public function setNumber(int|float $number): void
    {
        $this->number = $number;
    }

    public function getNumber(): int|float
    {
        return $this->number;
    }
}

(new Number())->setNumber("string"); // Uncaught TypeError

5. Match expression.

Hàm match được thêm mới với tính năng tương tự như switch, nhưng match sẽ so sánh chặt chẽ hơn switch.

VD: match feature.

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

// Ouput: This is what I expected

Ở ví dụ trên nếu như các bạn sử dụng switch thì sẽ cho kết quả là "Oh no!". Vì switch không so sách chặt chẽ kiểu dữ liệu.

VD: switch

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

// Ouput: Oh no!

6. Nullsafe operator.

Tính năng này tuy là mới đối với PHP nhưng trong một số ngôn ngữ khác như Groovy thì nó đã có từ rất lâu rồi.
Toán tử này cho phép chúng ta thực thi các chuỗi truy vấn đến các phần tử con, nếu như có bất kì một phần từ nào trả về null thì các toán tử phía sau sẽ không được thực thi nữa mà sẽ là null.

VD:

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

Trong ví dụ trên khi mà session, user hoặc getAddress() mà trả về null thì các truy vấn phía sau nó (nằm bên phải) sẽ không được thực thi nữa mà sẽ mặc định bằng null.

7. Saner string to number comparisons.

Về phần này mình nghĩ nó không phải là một feature mà là một bugfix thì đúng hơn. 

Đối với các phiên bản PHP cũ khi chúng ta so sánh "==" 0 với một chuỗi bất kì thì nó đều trả về true. Nhưng lần này trong phiên bản PHP 8 họ đã thay đổi logic check của toán tử == . Đầu tiên họ sẽ so sánh số như bình thường, nếu không bằng thì họ sẽ convert số sang string rồi so sánh.

VD:

// PHP 7

0 == 'toidicode' // true

// PHP 8


0 == 'toidicode' // false

8. Consistent type errors for internal functions.

Bây giờ, những warning liên quan đến check kiểu dữ liệu parameter, sẽ được PHP chuyển đổi thành Exception.

VD: 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

VD: 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

9. Just-In-Time.

Trong phiên bản PHP 8.0 lần này PHP cung cấp 2 phiên bản JIT là Tracing JIT và Function JIT. Trong đó Tracing JIT cho hiệu suất gấp 3 lần so với các benchmarks thông thường và gấp 1.5 đến 2 lần cho nhưng ứng dụng long running.

Các bạn có thể tham khảo hình sau:


PHP Jut in time - JIT

Đăng ký nhận tin.

Chúng tôi chỉ gửi tối đa 2 lần trên 1 tháng. Tuyên bố không spam mail!

Vũ Thanh Tài

About author
The best way to learn is to share
Xem tất cả bài đăng

0 Comments

Bài viết chưa có ai bình luận, hãy là người đầu tiên đi bạn!

Bình luận

Captcha