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 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:
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 ( Cú pháp điển hình của Union loại trông như thế này:
Hàm 0, loại cả 1 và 2 và trả về giá trị của int hoặc float .Loại Liên minh trong Php 7Php 7 chỉ hỗ trợ hai loại công đoàn đặc biệt này:
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:
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 8Như 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:
Học sinh lớp (Php 8)
Sự kết luậnCá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 1, trong khi PHP 8 đã hỗ trợ tích hợp cho nó. Người đóng góp Abel Lifaefi Mbula 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.0Vớ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; JITTrì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 PHPNế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 PHPCá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 Constructor0 => "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 ExampleAttributepublic $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.
0 => "hello",
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 PHPpublic 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(): staticreturn 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 objectsMộ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 catchesBấ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 objectsMộ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ớiResource 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 PHPCá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 PHPViệ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 PHPTừ 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ẵnTrướ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.0Như đã đề 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 PHPRấ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 [] % [42]; Namespaced namesPHP đượ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 numberRFC đã 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 PHPMột số phương thức reflection không được dùng nữa:
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 địnhTrướ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. |