Hướng dẫn php 7.4 union types - php 7.4 các loại liên minh

Hướng dẫn php 7.4 union types - php 7.4 các loại liên minh
Abel Lifaefi Mbula

Show

Trong bức ảnh này, tôi muốn bạn tìm hiểu về một tính năng PHP có tên là Union Union Type và cách thực hiện hoặc sử dụng nó trong PHP 7PHP 8. Không có thêm bất kỳ quảng cáo nào nữa, hãy để bắt đầu.

Loại công đoàn là gì?

Nói chung, các loại công đoàn được định nghĩa như sau:union types are defined as follows:

Một tập hợp các giá trị được lưu trữ trong cùng một vị trí trong bộ nhớ với các loại/định dạng dữ liệu khác nhau.

Nói tóm lại, loại Union cho phép bạn xác định bộ sưu tập hai hoặc nhiều loại (int, ________ 6)) cho các biến hoặc tham số chức năng của bạn. Ví dụ: bạn có thể có một chức năng trong chương trình của mình chấp nhận tham số thuộc loại int hoặc string.

Cú pháp điển hình của Union loại trông như thế này:

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

Hàm foo (ở trên) chấp nhận tham số,

class Student

{

/**

* @var int|float $roomNo

*/

private $roomNo;

/**

* @param int|float $roomNo

*/

public function setRoomNo($roomNo) {

$this->roomNo = $roomNo;

}

/**

* @return int|float

*/

public function getRoomNo() {

return $this->roomNo;

}

}

$newStudent1 = new Student;

$newStudent1->setRoomNo(25.0);

$newStudent2 = new Student;

$newStudent2->setRoomNo(4);

echo "Student 1 number is " .$newStudent1->getRoomNo(). "
";

echo "Student 2 number is " .$newStudent2->getRoomNo();

0, loại cả

class Student

{

/**

* @var int|float $roomNo

*/

private $roomNo;

/**

* @param int|float $roomNo

*/

public function setRoomNo($roomNo) {

$this->roomNo = $roomNo;

}

/**

* @return int|float

*/

public function getRoomNo() {

return $this->roomNo;

}

}

$newStudent1 = new Student;

$newStudent1->setRoomNo(25.0);

$newStudent2 = new Student;

$newStudent2->setRoomNo(4);

echo "Student 1 number is " .$newStudent1->getRoomNo(). "
";

echo "Student 2 number is " .$newStudent2->getRoomNo();

1 và

class Student

{

/**

* @var int|float $roomNo

*/

private $roomNo;

/**

* @param int|float $roomNo

*/

public function setRoomNo($roomNo) {

$this->roomNo = $roomNo;

}

/**

* @return int|float

*/

public function getRoomNo() {

return $this->roomNo;

}

}

$newStudent1 = new Student;

$newStudent1->setRoomNo(25.0);

$newStudent2 = new Student;

$newStudent2->setRoomNo(4);

echo "Student 1 number is " .$newStudent1->getRoomNo(). "
";

echo "Student 2 number is " .$newStudent2->getRoomNo();

2 và trả về giá trị của int hoặc float.

Loại Liên minh trong Php 7

Php 7 chỉ hỗ trợ hai loại công đoàn đặc biệt này:

  • Các loại liên minh có thể sử dụng ký hiệu

    class Student

    {

    /**

    * @var int|float $roomNo

    */

    private $roomNo;

    /**

    * @param int|float $roomNo

    */

    public function setRoomNo($roomNo) {

    $this->roomNo = $roomNo;

    }

    /**

    * @return int|float

    */

    public function getRoomNo() {

    return $this->roomNo;

    }

    }

    $newStudent1 = new Student;

    $newStudent1->setRoomNo(25.0);

    $newStudent2 = new Student;

    $newStudent2->setRoomNo(4);

    echo "Student 1 number is " .$newStudent1->getRoomNo(). "
    ";

    echo "Student 2 number is " .$newStudent2->getRoomNo();

    5:

    class Student

    {

    /**

    * @var int|float $roomNo

    */

    private $roomNo;

    /**

    * @param int|float $roomNo

    */

    public function setRoomNo($roomNo) {

    $this->roomNo = $roomNo;

    }

    /**

    * @return int|float

    */

    public function getRoomNo() {

    return $this->roomNo;

    }

    }

    $newStudent1 = new Student;

    $newStudent1->setRoomNo(25.0);

    $newStudent2 = new Student;

    $newStudent2->setRoomNo(4);

    echo "Student 1 number is " .$newStudent1->getRoomNo(). "
    ";

    echo "Student 2 number is " .$newStudent2->getRoomNo();

    6
  • class Student

    {

    /**

    * @var int|float $roomNo

    */

    private $roomNo;

    /**

    * @param int|float $roomNo

    */

    public function setRoomNo($roomNo) {

    $this->roomNo = $roomNo;

    }

    /**

    * @return int|float

    */

    public function getRoomNo() {

    return $this->roomNo;

    }

    }

    $newStudent1 = new Student;

    $newStudent1->setRoomNo(25.0);

    $newStudent2 = new Student;

    $newStudent2->setRoomNo(4);

    echo "Student 1 number is " .$newStudent1->getRoomNo(). "
    ";

    echo "Student 2 number is " .$newStudent2->getRoomNo();

    7 hoặc

    class Student

    {

    /**

    * @var int|float $roomNo

    */

    private $roomNo;

    /**

    * @param int|float $roomNo

    */

    public function setRoomNo($roomNo) {

    $this->roomNo = $roomNo;

    }

    /**

    * @return int|float

    */

    public function getRoomNo() {

    return $this->roomNo;

    }

    }

    $newStudent1 = new Student;

    $newStudent1->setRoomNo(25.0);

    $newStudent2 = new Student;

    $newStudent2->setRoomNo(4);

    echo "Student 1 number is " .$newStudent1->getRoomNo(). "
    ";

    echo "Student 2 number is " .$newStudent2->getRoomNo();

    8 bằng cách sử dụng loại có thể

Php 7 không hỗ trợ các loại liên minh tùy ý, nhưng là một cách giải quyết, chúng ta có thể sử dụng chú thích PHPDOC. Hãy cùng xem một ví dụ về việc sử dụng nó dưới đây:

class Student

{

/**

* @var int|float $roomNo

*/

private $roomNo;

/**

* @param int|float $roomNo

*/

public function setRoomNo($roomNo) {

$this->roomNo = $roomNo;

}

/**

* @return int|float

*/

public function getRoomNo() {

return $this->roomNo;

}

}

$newStudent1 = new Student;

$newStudent1->setRoomNo(25.0);

$newStudent2 = new Student;

$newStudent2->setRoomNo(4);

echo "Student 1 number is " .$newStudent1->getRoomNo(). "
";

echo "Student 2 number is " .$newStudent2->getRoomNo();

Học sinh lớp

Bây giờ, hãy để Lôi nhìn vào cách thức của Liên minh, được cải thiện trong Php 8.

Loại Liên minh trong Php 8

Như chúng tôi đã thấy ở trên, PHP 7 thiếu hỗ trợ tích hợp cho các loại liên minh tùy ý. Vì vậy, PHP 8 đã triển khai hỗ trợ tích hợp cho các loại liên minh tùy ý.

Với ví dụ tương tự như trên, ở đây, cách bạn có thể sử dụng các loại công đoàn trong Php 8:

class Student

{

private int|float $roomNo;

public function setRoomNo(int|float $roomNo): void {

$this->roomNo;

}

public function getRoomNo(): int|float {

return $this->roomNo;

}

}

$newStudent1 = new Student;

$newStudent1->setRoomNo(25.0);

$newStudent2 = new Student;

$newStudent2->setRoomNo(4);

echo "Student 1 number is " .$newStudent1->getRoomNo(). "
";

echo "Student 2 number is " .$newStudent2->getRoomNo();

Học sinh lớp (Php 8)

Ghi chú

  • Loại

    class Student

    {

    /**

    * @var int|float $roomNo

    */

    private $roomNo;

    /**

    * @param int|float $roomNo

    */

    public function setRoomNo($roomNo) {

    $this->roomNo = $roomNo;

    }

    /**

    * @return int|float

    */

    public function getRoomNo() {

    return $this->roomNo;

    }

    }

    $newStudent1 = new Student;

    $newStudent1->setRoomNo(25.0);

    $newStudent2 = new Student;

    $newStudent2->setRoomNo(4);

    echo "Student 1 number is " .$newStudent1->getRoomNo(). "
    ";

    echo "Student 2 number is " .$newStudent2->getRoomNo();

    9 không bao giờ có thể là một phần của loại liên minh vì nó chỉ ra rằng hàm không trả về bất kỳ giá trị nào
  • Loại liên minh vô hiệu cũng có thể được viết là:

    class Student

    {

    private int|float $roomNo;

    public function setRoomNo(int|float $roomNo): void {

    $this->roomNo;

    }

    public function getRoomNo(): int|float {

    return $this->roomNo;

    }

    }

    $newStudent1 = new Student;

    $newStudent1->setRoomNo(25.0);

    $newStudent2 = new Student;

    $newStudent2->setRoomNo(4);

    echo "Student 1 number is " .$newStudent1->getRoomNo(). "
    ";

    echo "Student 2 number is " .$newStudent2->getRoomNo();

    0

Sự kết luận

Các loại công đoàn là một chức năng tuyệt vời trong PHP cho phép chúng tôi xác định một biến của nhiều loại trong chương trình của chúng tôi. Php 7 hỗ trợ các loại liên minh tùy ý thông qua chú thích

class Student

{

private int|float $roomNo;

public function setRoomNo(int|float $roomNo): void {

$this->roomNo;

}

public function getRoomNo(): int|float {

return $this->roomNo;

}

}

$newStudent1 = new Student;

$newStudent1->setRoomNo(25.0);

$newStudent2 = new Student;

$newStudent2->setRoomNo(4);

echo "Student 1 number is " .$newStudent1->getRoomNo(). "
";

echo "Student 2 number is " .$newStudent2->getRoomNo();

1, trong khi PHP 8 đã hỗ trợ tích hợp cho nó.

Người đóng góp

Abel Lifaefi Mbula

Hướng dẫn php 7.4 union types - php 7.4 các loại liên minh

Tìm hiểu các 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

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();

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 thêm: Top 5 phần mềm viết PHP tốt nhất năm 2021

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, 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 const FOO = 'foo';

    #[ExampleAttribute]

    {

    public $x;

    }

}

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.

Match Expression

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) { Khóa học lập trình PHP

Constructor 

    0 => "hello",

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

};

{

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

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,

    ) {

{

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

class Money

    public Currency $currency;

    public int $amount;

}

class ExampleAttribute

    public $value;

class Foo

{

    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.

Match Expression

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",
  • };
  • >>> Tham khảo: Khóa học lập trình PHP
  • int
  • float
  • null
  • 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 MoneyTính năng mới của PHP

        public Currency $currency,

        public int $amount,

    ) {}

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. 

    public function test(): static

        return new static();

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);

    }

}

Cho phép ::class trên objects

Một tính năng nhỏ, nhưng hữu ích: Bây giờ bạn 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 giống như get_class().

$foo = new Foo();

var_dump($foo::class);

Non-capturing catches

Bất cứ khi nào bạn muốn bắt một ngoại lệ trước PHP 8, bạn phải lưu trữ nó trong một biến, bất kể bạn có sử dụng biến đó hay không. Với non-capturing catches, bạn có thể bỏ qua biến, vì vậy thay vì sử dụng:

try {

    // Something goes wrong

} catch (MySpecialException $exception) {

    Log::error("Something went wrong");

}

Cho phép ::class trên objects

try {

    // Something goes wrong

} catch (MySpecialException $exception) {

    Log::error("Something went wrong");

}

Cho phép ::class trên objects

Một tính năng nhỏ, nhưng hữu ích: Bây giờ bạn 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 giống như get_class().

$foo = new Foo();

Non-capturing catches

Bất cứ khi nào bạn muốn bắt một ngoại lệ trước PHP 8, bạn phải lưu trữ nó trong một biến, bất kể bạn có sử dụng biến đó hay không. Với non-capturing catches, bạn có thể bỏ qua biến, vì vậy thay vì sử dụng:

try {

    // Something goes wrong

} catch (MySpecialException $exception) {

    Log::error("Something went wrong");

}

Cho phép ::class trên objects

Một tính năng nhỏ, nhưng hữu ích: Bây giờ bạn 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 giống như get_class().

$foo = new Foo();

Non-capturing catches

Bất cứ khi nào bạn muốn bắt một ngoại lệ trước PHP 8, bạn phải lưu trữ nó trong một biến, bất kể bạn có sử dụng biến đó hay không. Với non-capturing catches, bạn có thể bỏ qua biến, vì vậy thay vì sử dụng:

try {

    // Something goes wrong

} catch (MySpecialException $exception) {

class Foo

{

    private WeakMap $cache;

    {

    public function getSomethingWithCaching(object $obj): object

    }

}

Cho phép ::class trên objects

Một tính năng nhỏ, nhưng hữu ích: Bây giờ bạn 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 giống như get_class().

bar('abc');

$foo = new Foo();

Non-capturing catches

Bất cứ khi nào bạn muốn bắt một ngoại lệ trước PHP 8, bạn phải lưu trữ nó trong một biến, bất kể bạn có sử dụng biến đó hay không. Với non-capturing catches, bạn có thể bỏ qua biến, vì vậy thay vì sử dụng:

try {

    // Something goes wrong

} catch (MySpecialException $exception) {

    Log::error("Something went wrong");

Giờ bạn có thể làm thế này:

} catch (MySpecialException) {

Lưu ý rằng nó bắt buộc phải luôn chỉ định kiểu, bạn không được phép để trống catch. Nếu bạn muốn bắt tất cả các ngoại lệ và lỗi, bạn có thể sử dụng Throwable

Dấu phẩy ở cuối trong danh sách tham số

Hiện tại, dấu phẩy ở cuối danh sách tham số đã được phép trong PHP 8, có nghĩa là bạn có thể làm như sau:

public function(

    string $parameterA,

Ví dụ: gọi gettype() trên một lớp \Foo\Bar sẽ trả về object. Sử dụng get_debug_type() sẽ trả về tên lớp.

Bạn có thể tìm thấy danh sách đầy đủ về sự khác biệt giữa get_debug_type() và gettype() trong RFC.

Hàm get_resource_id() mới

Resource là các biến đặc biệt trong PHP, đề cập đến các tài nguyên bên ngoài. Một ví dụ là kết nối MySQL, một ví dụ khác là kết nối tệp.

Mỗi một trong những tài nguyên đó được gán một ID, mặc dù trước đây cách duy nhất để biết id đó là chuyển tài nguyên thành int:

$resourceId = (int) $resource;

PHP 8 thêm hàm get_resource_id(), làm cho thao tác này rõ ràng hơn và an toàn hơn:

$resourceId = get_resource_id($resource);

Phương thức trừu tượng trong traits - Tính năng mới của PHP

Các traits có thể chỉ định các phương thức trừu tượng mà các lớp sử dụng chúng phải thực hiện.

Tuy nhiên, có một lưu ý: Trước PHP 8, chữ ký của các triển khai phương thức này không được xác thực. Điều này là hợp lệ:

trait Test {

    abstract public function test(int $input): int;

}

class UsesTrait

{

    use Test;

    public function test($input)

    {

        return $input;

    }

}

class UsesTrait

{

class UsesTrait

{

    use Test;

    public function test($input)

    {

        return $input;

    }

}

class UsesTrait

{

    use Test;

    public function test($input)

        return $input;

    }

PHP 8 sẽ thực hiện xác thực chữ ký phương thức thích hợp khi sử dụng một trait và triển khai các phương thức trừu tượng của nó.

Có nghĩa là giờ bạn sẽ cần viết thế này để thay thế:

    public function test(int $input): intNÂNG CẤP PHP8.

Triển khai đối tượng của token_get_all() - Tính năng mới của PHP

Hàm token_get_all() trả về một mảng giá trị. RFC thêm một lớp PhpToken với một phương thức PhpToken::tokenize().Tính năng mới của PHP

Việc triển khai này hoạt động với các đối tượng thay vì các giá trị thuần túy. Nó tiêu tốn ít bộ nhớ hơn và dễ đọc hơn.

Chỉnh sửa cú pháp biếnTính năng mới của PHP

Từ RFC: 'RFC đã giải quyết một số mâu thuẫn trong cú pháp biến của PHP. RFC này dự định giải quyết một số ít các trường hợp đã bị bỏ qua. '

ext-json luôn có sẵn

Trước đây, có thể biên dịch PHP mà không cần bật tiện ích mở rộng JSON, điều này không còn khả thi nữa. Vì JSON được sử dụng rộng rãi nên tốt nhất là các lập trình viên luôn có thể tin tưởng là nó đã ở đó, thay vì phải đảm bảo tiện ích mở rộng tồn tại.

Các thay đổi đột phá trong PHP 8.0

Như đã đề cập ở trên: Đây là một bản cập nhật lớn với nhiều tính năng mới của PHP. Và do đó sẽ có những thay đổi đột phá. Điều tốt nhất bạn cần làm là xem danh sách đầy đủ các thay đổi đột phá tại tài liệu NÂNG CẤP PHP8.

Mặc dù vậy, nhiều thay đổi đột phá này đã không còn được dùng trong các phiên bản 7.* trước đó, vì vậy nếu bạn đã cập nhật trong nhiều năm, thì việc nâng cấp lên PHP 8 sẽ không quá khó.

Nhất quán Type Error - Tính năng mới của PHP

Các hàm do người dùng định nghĩa trong PHP sẽ ném ra TypeError, nhưng các hàm nội bộ thì không, chúng phát ra cảnh báo và trả về null. Kể từ PHP 8, hành vi của các hàm nội bộ đã được thực hiện nhất quán.

Phân loại cảnh báo - Tính năng mới của PHPTính năng mới của PHP

Rất nhiều lỗi trước đây chỉ kích hoạt cảnh báo hoặc thông báo, đã được chuyển đổi thành lỗi thích hợp.

Toán tử @ không còn chặn các lỗi nghiêm trọng nữa

Có thể sự thay đổi này có thể làm lộ ra các lỗi đã được ẩn trước PHP 8. Hãy đảm bảo đặt display_errors=Off trên production server của bạn!

Mức báo cáo lỗi mặc định

Bây giờ là E_ALL thay thế mọi thứ trừ E_NOTICE và E_DEPRECATED. Điều này có nghĩa là nhiều lỗi có thể bật lên mà trước đó đã bị bỏ qua một cách âm thầm, mặc dù có thể đã tồn tại trước PHP 8.

Chế độ lỗi PDO mặc định
Kiểm tra kiểu chặt chẽ hơn cho các toán tử số học và bitwise
Trước PHP 8, có thể áp dụng toán tử số học hoặc toán tử bitwise trên mảng, tài nguyên hoặc đối tượng. Nhưng giờ thì không còn khả thi nữa và sẽ xuất hiện TypeError: 

[] % [42];

Namespaced names

PHP được sử dụng để diễn giải từng phần của namespace (phân tách bằng dấu gạch chéo ngược \) như một chuỗi các token. RFC đã thay đổi hành vi đó, có nghĩa là các tên dành riêng hiện có thể được sử dụng trong namespace.

Saner numeric strings

Hệ thống kiểu của PHP cố gắng thực hiện nhiều điều thông minh khi nó gặp các số trong chuỗi. RFC làm cho hành vi đó nhất quán và rõ ràng hơn.

So sánh Saner string với number

RFC đã khắc phục trường hợp rất lạ trong PHP đó là việc 0 == 'foo' cho kết quả là true. Vẫn có một số trường hợp khác giống như trường hợp này và RFC này sẽ sửa chúng.

Thay đổi Reflection - Tính năng mới của PHPTính năng mới của PHP

Một số phương thức reflection không được dùng nữa:

  • ReflectionFunction::isDisabled()
  • ReflectionParameter::getClass()
  • ReflectionParameter::isCallable()

Bây giờ bạn nên sử dụng ReflectionType để nhận thông tin về kiểu của tham số:

$reflectionParameter->getType()->allowsNull();

Nếu kiểu là một kiểu duy nhất, ReflectionParameter::getType() trả về một thể hiện của ReflectionNamedType, bạn có thể:

$reflectionParameter->getType()->getName();

$reflectionParameter->getType()->isBuiltin();

Tuy nhiên, nếu kiểu là kiểu liên hợp, bạn sẽ nhận được một thể hiện của ReflectionUnionType, có thể cung cấp cho bạn một mảng ReflectionNamedType như sau:

$reflectionParameter->getType()->getTypes();

Kiểm tra xem một kiểu có phải là liên hợp hay không có thể được thực hiện bằng kiểm tra instanceof:

if ($reflectionParameter->getType() instanceof ReflectionNamedType) { 

    // It's a single type

if ($reflectionParameter->getType() instanceof ReflectionUnionType) {

    // It's a union type

}

Tiếp theo, ba chữ ký phương thức của các lớp reflection đã được thay đổi:

ReflectionClass::newInstance($args);

ReflectionFunction::invoke($args);

ReflectionMethod::invoke($object, $args);

Bây giờ đã trở thành:

ReflectionClass::newInstance(...$args);

ReflectionFunction::invoke(...$args);

ReflectionMethod::invoke($object, ...$args);

Hướng dẫn nâng cấp chỉ định rằng nếu bạn mở rộng các lớp này và vẫn muốn hỗ trợ cả PHP 7 và PHP 8, thì làm như sau:

ReflectionClass::newInstance($arg = null, ...$args);

ReflectionFunction::invoke($arg = null, ...$args);

ReflectionMethod::invoke($object, $arg = null, ...$args);

Sắp xếp ổn định

Trước PHP 8, các thuật toán sắp xếp không ổn định. Điều này có nghĩa là thứ tự của các phần tử bằng nhau không được đảm bảo. PHP 8 thay đổi hành vi của tất cả các hàm sắp xếp thành sắp xếp ổn định.

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 các khóa học lập trình tại T3H.  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 các khóa học lập trình tại T3H.