Toidicode.com

Toidicode.com

BASIC TO ADVANCE

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

Tiếp tục với bài trước, bài này mình sẽ tiếp tục cập nhật thêm các tính năng có trong PHP 8.

10. Stricter type checks for arithmetic/bitwise operators.

Phiên bản lần này PHP cũng ràng buộc kĩ hơn những phân liên quan đến các toán tử số học hay bitwise trong PHP.

VD: như chia 2 array, decrement array.

[] % [42] // PHP Warning:  Uncaught TypeError: Unsupported operand types: array % array in php shell code

$a = [['one'], ['two']];
foreach ($a as $var) {
    $var--;
}

// Output: PHP Fatal error:  Uncaught TypeError: Cannot decrement array

11. Validation for abstract trait methods.

Trước đây, chúng ta đã có thể khai báo phương thức trừu tượng (abstract method) trong Trait nhưng việc validate sử dụng nó lại rất thất thường.

VD: Đối với PHP 7

trait MyTrait
{
    abstract private function neededByTheTrait(): string;

    public function doSomething()
    {
        return strlen($this->neededByTheTrait());
    }
}

class TraitUser
{
    use MyTrait;

    // This is allowed:
    private function neededByTheTrait(): string
    {
    }

}

// Ouput: PHP Fatal error:  Abstract function MyTrait::neededByTheTrait() cannot be declared private

Việc khai báo abstract trong khi không thể sử dụng được? WTF?

GIờ đây đối với PHP 8 đã hoàn thiện hơn và hoạt động tốt.

12. Correct signatures of magic methods.

Giờ đây các magic method bắt buộc phải return đúng kiểu được quy định chứ không thoải mái như trước nữa. Hay các tham số truyền vào cũng cần phải validate

VD: Đối với PHP 7.

class SampleClass
{
    public function __isset($name): string
    {
        // TODO: Implement __isset() method.
    }

    public function __clone(): int
    {
        // TODO: Implement __clone() method.
    }
}

Nhưng đối với PHP 8 sẽ trả về error. Như sau:

PHP Fatal error:  SampleClass::__isset(): Return type must be bool when declared

PHP Fatal error:  SampleClass::__clone(): Return type must be void when declared

VD: Truyền tham số thứ nhất là array và tham số thứ 2 là chuỗi trong PHP7.4

class SampleClass
{
    public function __call(array $name, string $arguments)
    {
        // TODO: Implement __call() method.
    }
}

Nhưng với PHP 8 sẽ trả về error. Như sau:

PHP Fatal error:  SampleClass::__call(): Parameter #1 ($name) must be of type string when declared
PHP Fatal error:  SampleClass::__call(): Parameter #2 ($arguments) must be of type array when declared

Và đây là list return type của các magic method:

  • __clone - không trả về giá trị (return void)
  • __isset - trả về kiểu bool
  • __sleep - trả về array
  • __set - không trả về giá trị (return void)
  • __toString - trả về string
  • __wakeup - không trả về giá trị (return void)

Và đây param type truyền vào các magic method:

  • __call/__callStatic - tham số thứ nhất phải là string, tham số thứ 2 phải là mảng
  • __get/__set/__isset/__unset - tham số phải là string
  • __set_state - tham số phải là array.

13. Reclassifying engine warnings.

Phân biệt lại các cảnh báo, error trong PHP. Ở phiên bản này PHP sẽ gom nhóm, phân loại lại các lỗi vào các Exception khác nhau.
Trong các trường hợp các bạn cần catch lại được hêt các Error các bạn cần phải catch qua Throwable vì những Error như Type Error lại không được base từ Exception (cái này từ PHP 7 => hơi củ chuối).

Các bạn có thể xem thêm các quy tắc gom nhóm của PHP (ở đây)

14. Fatal error for incompatible method signatures.

Chuyển tất cả các warning đối với các vấn đề implement method không tương thức với base thành Fatal error.

VD: Khi ta khai báo lại method trong class con mà thay đổi type truyền vào method trong các phiên bản PHP 7 nó chỉ coi đó là warning thôi. Giờ đây PHP 8 sẽ coi những kiểu lỗi như này là "Fatal error"

class C1 {
    public function method(array $a) {}
}
class C2 extends C1 {
    public function method(int $a) {}
}

// PHP 8 ouput: PHP Fatal error:  Declaration of C2::method(int $a) must be compatible with C1::method(array $a)

15. The @ operator no longer silences fatal errors.

Từ phiên bản PHP 8, khi bạn sử dụng kí tự @ trước các câu lệnh nó sẽ không ngăn được các "fatal errors" nữa.

VD: Đối với PHP 7

@ $a % [""];

Nhưng đối với PHP 8 nó sẽ throw ra "fatal error"

16. Inheritance with private methods.

Giờ đây PHP 8 sẽ bắn ra warning khi bạn khai báo một phương thức privatefinal. Vì một phương thức đã khai báo là private thì chúng ta cũng không thể nào thấy nó trong class cha, và vì vậy việc orverwrite nó là vô nghĩa.

VD: PHP 8 sẽ bắn ra waring nếu bạn cố gắng muốn khai báo một private method là final.

class A
{
    final private function finalPrivate()
    {
        echo "a" . __METHOD__ . PHP_EOL;
    }
}

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

17. Mixed type.

Trong trường hợp nếu như bạn không biết được type của arguments hay return type của function, method. Đối với các phiên bản cũ của PHP các bạn chỉ cẩn bỏ trống không khai báo data type là được. Nhưng như thế sẽ hơi dở vì code đang set type hết mà mọc ra mấy đoạn code không có type. Chính vì thế trong phiên bản PHP 8 họ đã bổ sung thêm mixed type. Kiểu này trước đây chỉ hỗ trợ trong PHPDoc block.

VD:

function test(mixed $a) : mixed
{
    return $a;
}

18. Một số tính năng khác.

Thêm WeakMap class (cái này mình sẽ có bài nói sau)

Stringable interface

Thêm str_contains(), str_starts_with(), str_ends_with() function.

Cho phép sử dụng Allow ::class on objects
...

Đă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