Php str_contains

Với bản chất được định dạng 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 loại liên kết 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

 

hàm công khai foo(Foo. Thanh $đầu vào). int. trôi nổi;

Lưu ý rằng khoảng trống không bao giờ có thể là một phần của loại công đoàn, bởi vì nó chỉ ra 'không có giá trị trả lại cho cả'. Hơn nữa, nullable có thể được viết bằng cách sử dụng. null, or by cách sử dụng ký hiệu ?

hàm công khai foo(Foo. null $foo). vô hiệu;

thanh chức năng công cộng(?Bar $bar). vô hiệu;

JIT

Trình biên dịch JIT - Just-in-time Compiler hứa hẹn cải thiện hiệu quả đáng kể, mặc dù không phải lúc nào cũng 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 đã thuộc về liên hợp toán tử null thì bạn đã quen thuộc với những điểm yếu của nó. Nó không hoạt động trên các cuộc gọi phương thức. Thay vào đó, bạn cần kiểm tra trung gian hoặc dựa vào các tùy chọn trợ giúp của chương trình được cung cấp bởi một số khung, ví dụ như sau

 

$startDate = $booking->getStartDate();

$dateAsString = $startDate? . vô giá trị;

Với việc bổ sung toán tử nullsafe, bây giờ chúng ta có thể thực hiện hành vi giống như toán liên hợp null trên các phương thức

 

$dateAsString = $booking->getStartDate()?->asDateTimeString();

Đặt tên cho đối số - Tính năng mới của PHP

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 được 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

hàm foo(chuỗi $a, chuỗi $b, ?chuỗi $c = null, ?chuỗi $d = null)

{ /* … */ }

foo(

b. 'giá trị b',

một. 'giá trị a',

đ. 'giá trị 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 các 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 meta dữ liệu vào các lớp mà không cần phải phân tích các cú pháp cú pháp.

Dưới đây là một ví dụ về các thuộc tính trông như thế nào, từ RFC

#[ExampleAttribute]

lớp foo

{

#[ExampleAttribute]

công khai const FOO = 'foo';

 

#[ExampleAttribute]

công khai $x;

 

#[ExampleAttribute]

hàm công khai foo(#[ExampleAttribute] $bar) { }

}

 

#[Thuộc tính]

lớp Ví dụ Thuộc tính

{

giá trị $ công khai;

 

hàm công khai __construct($value)

{

$this->value = $value;

}

}

Lưu ý là Thuộc tính cơ sở 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

Biểu thức đối sánh

Bạn có thể gọi nó là anh cả của công tắc biểu thức, đối sánh có thể trả về giá trị, không yêu cầu câu lệnh ngắt, có thể kết hợp các điều kiện, sử dụng kiểu so sánh nghiêm trọng và không thực hiện bất kỳ kiểu nào

Ví dụ như sau

$result = match($input) {

0 => "xin chào",

'1', '2', '3' => "thế giới",

};

>>>Tham khảo. Key learning setting PHP

Người xây dựng

RFC bổ sung thêm cú pháp đặc biệt để tạo giá trị cho các đối tượng hoặc đối tượng truyền dữ liệu. Thay vì chỉ xác đị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.  

lớp tiền

{

Tiền tệ công cộng $currency;

 

công khai số tiền int $;

chức năng công khai __construct(

Tiền tệ $ tệ,

số tiền int $,

) {

$this->currency = $currency;

$this->amount = $amount;

}

}

Bây giờ bạn có thể làm thế này trong PHP 8

lớp tiền

{

chức năng công khai __construct(

Tiền tệ công cộng $ tệ,

công khai số tiền int $,

) {}

}

Kiểu trả về tĩnh mới

Mặc dù đã có thể tự động trả về, nhưng tĩnh không phải là kiểu trả về hợp lệ cho PHP 8. Với kiểu động chất lượng của PHP, đây là một tính năng sẽ hữu ích cho nhiều lập trình viên.  

lớp foo

{

kiểm tra chức năng công khai(). tĩnh

{

trả về tĩnh mới();

}

}

Kiểu hỗn hợp mới

Kiểu hỗn hợp (hỗn hợp) này có thể khiến nhiều người cảm thấy xúc động

Tuy nhiên, có một lập luận rất tốt để giải quyết vấn đề này. Một kiểu bị thiếu có thể có nhiều nghĩa trong PHP

  • Một hàm không trả về bất cứ điều gì hoặc null
  • Chúng ta đang chờ đợi một số kiểu,

Bởi vì những lý do trên, kiểu hỗn hợp được thêm vào là một điều tốt. Bản thân hỗn hợp có nghĩa là một trong các kiểu sau

  • mảng
  • bool
  • gọi được
  • int
  • trôi nổi
  • vô giá trị
  • vật
  • nguồn
  • chuỗi

Lưu ý là hỗn hợp cũng có thể được sử dụng như một tham số hoặc kiểu thuộc tính, không chỉ như một kiểu trả về

Cũng lưu ý rằng vì mix đã bao gồm null nên không được phép làm cho nó có giá trị rỗng. Điều sau sẽ gây ra lỗi

// Lỗi nghiêm trọng. Các loại hỗn hợp không thể rỗng,

// null đã là một phần của kiểu hỗn hợp

thanh chức năng(). ?Trộn {}

biểu thức ném

RFC thay đổi ném từ một câu lệnh thành một biểu thức, điều này làm cho nó có thể ném ngoại lệ ở nhiều vị trí mới

$triggerError = fn() => throw new MyError();

$foo = $bar['offset'] ??

Kế thừa với các phương thức riêng - Tính năng mới của PHP

Trước đây, PHP đã từng áp dụng các kiểm tra kế thừa giống nhau trên các phương thức public, protected và private

Nói cách khác. Các phương thức private phải tuân theo các quy tắc giống như các phương thức được bảo vệ và công khai. Điều này không có ý nghĩa, bởi vì các phương thức private sẽ không được các lớp con truy cập

RFC đã thay đổi hành động đó, để kiểm tra kế thừa này không được thực hiện trên các phương thức riêng tư nữa

Hơn nữa, việc sử dụng chức năng riêng tư cuối cùng cũng không có ý nghĩa, vì vậy làm như vậy bây giờ sẽ kích hoạt cảnh báo

Cảnh báo. Các phương thức riêng tư không thể là cuối cùng vì chúng không bao giờ bị ghi đè bởi các lớp khác

Weakmap - Tính năng mới của PHP 8. 0

Weakmap là một trong những tính năng mới của PHP được thêm vào phiên bản 8. 0. Được xây dựng dựa trên các tham chiếu yếu RFC đã được thêm vào trong PHP 7. 4, một bản khai triển WeakMap được thêm vào trong PHP 8

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 tôi thường phát triển khai báo các bộ nhớ đệm bao gồm các tham chiếu đến các lớp thực thể để cải thiện hiệu suất quan hệ giữa các thực thể. Không thể thu thập các đối tượng có thể thực hiện được, miễn phí là bộ đệm này có tham chiếu đến chúng, ngay cả khi bộ đệm là tham chiếu thứ nhất cho chúng

Nếu lớp bộ nhớ đệm này sử dụng các tham chiếu và ánh xạ yếu để thay thế, PHP sẽ thu thập các đối tượng này khi không còn 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 phần trăm, nếu không phải hàng hóa thực thi trong một yêu cầu;

Dưới đây để xem các bản đồ yếu trông như thế nào, một ví dụ từ RFC

lớp foo

{

riêng tư Bản đồ yếu $cache;

 

hàm công khai getSomethingWithCaching(object $obj). vật

{

trả về $this->cache[$obj]

??= $this->computeSomethingExpensive($obj);

}

}

Cho phép. lớp trên các đối tượng

Một tính năng nhỏ nhưng hữu ích. Bây giờ bạn có thể sử dụng. lớp 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 = foo mới();

var_dump($foo. lớp);

đánh bắt không bắt

Bất kể 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 các lần bắt không chụp, bạn có thể bỏ qua biến, vì vậy thay vì sử dụng

cố gắng {

// Đã xảy ra sự cố

} bắt (MySpecialException $ ngoại lệ) {

Nhật ký. error("Đã xảy ra lỗi");

}

Time you can to do this

cố gắng {

// Đã xảy ra sự cố

} bắt (MySpecialException) {

Nhật ký. error("Đã xảy ra lỗi");

}

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 bắt. 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 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

chức năng công cộng (

chuỗi $parameterS,

tham số int $B,

Foo $object foo, // Đánh dấu ở cuối

) {

// …

}

Tạo đối tượng DateTime từ giao diện - Tính năng mới của PHP

Bạn đã có thể tạo một đối tượng DateTime từ một đối tượng DateTimeImmutable bằng cách sử dụng DateTime. createFromImmutable($ immutableDateTime), nhưng cách khác lại khá phức tạp

Bằng cách thêm DateTime. createFromInterface() và DatetimeImmutable. createFromInterface(), bây giờ có một cách tổng quát để chuyển đổi các đối tượng DateTime và DateTimeImmutable cho nhau

Ngày giờ. createFromInterface(DateTimeInterface $other);

DateTimeImmutable. createFromInterface(DateTimeInterface $other);

Giao diện Stringable mới

Có thể sử dụng giao diện Stringable để nhập gợi ý bất kỳ thứ gì phát triển khai thác __toString()

Bất kể khi nào một lớp khai thác __toString(), nó sẽ tự động phát triển giao diện khai thác phía sau và không cần thiết phải phát triển khai thủ công

lớp foo

{

chức năng công cộng __toString(). chuỗi

{

trả lại 'foo';

}

}

 

thanh chức năng (chuỗi. Có thể xâu chuỗi $stringable) { /* … */ }

thanh (Foo mới ());

thanh('abc');

Hàm str_contains() mới

Một số người có thể nói rằng nó xuất hiện quá sớm, nhưng cuối cùng chúng ta không phải dựa vào strpos() nữa để kiểm tra dữ liệu một chuỗi có chứa một chuỗi khác hay không

Thay vì làm như trước đây

if (strpos('chuỗi có nhiều từ', 'từ'). == sai) { /* … */ }

Giờ chúng ta đã có chức năng dành riêng

if (str_contains('chuỗi có nhiều từ', 'từ')) { /* … */ }

Hàm str_start_with() và hàm str_start_end() mới

Hai chức năng này cũng xuất hiện quá nhiều. Bây giờ, chúng đã được thêm vào trong lỗi php

str_starts_with('đống cỏ khô', 'cỏ khô');

str_ends_with('đống cỏ khô', 'ngăn xếp');

Hàm fdiv() mới

Hàm fdiv() mới hoạt động tương tự như hàm fmod() và intdiv(), cho phép chia cho 0. Thay vì lỗi, bạn sẽ nhận được INF, -INF hoặc NAN, tùy trường hợp

Hàm get_debug_type() new - Tính năng mới của PHP

get_debug_type() return type of a variable. Có vẻ như một cái gì đó gettype() sẽ làm gì?

Ví dụ. call gettype() on an layer \Foo\Bar will return object. Use 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

Tài nguyên 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 các tài nguyên được gán một ID, mặc dù trước đây là 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 tác vụ này rõ ràng hơn và an toàn hơn

$resourceId = get_resource_id($resource);

Phương thức hiển thị đối tượng trong các đặc điểm - Tính năng mới của PHP

Các đặc điểm có thể chỉ định các phương thức hiển thị 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 công thức khai báo này không được xác thực. Điều này là hợp lệ

Kiểm tra đặc điểm {

kiểm tra chức năng công khai trừu tượng (int $input). int;

}

lớp Sử dụngTrait

{

sử dụng Kiểm tra;

kiểm tra chức năng công cộng($input)

{

trả lại đầu vào $;

}

}

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 đặc điểm và phát triển khai thác các đối tượng của phương thức đối tượng của nó

Có nghĩa là giờ bạn cần phải viết thế này để thay thế

lớp Sử dụngTrait

{

sử dụng Kiểm tra;

 

kiểm tra chức năng công cộng (int $input). int

{

trả lại đầu vào $;

}

}

Đối tượng khai báo của token_get_all() - Tính năng mới của PHP

Hàm token_get_all() return an value. RFC thêm một lớp PhpToken với một phương thức PhpToken. mã thông báo ()

Việc khai triển 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

Sửa cú pháp cú pháp

Từ RFC. 'RFC đã giải quyết một số ngoại diện trong biến cú pháp của PHP. RFC này dự kiến ​​sẽ giải quyết một số ít trường hợp đã bị loại bỏ. '

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. Bởi vì JSON được sử dụng rộng rãi nên tốt nhất là các thành viên lập trình luôn có thể tin rằng nó đã ở đó, thay vì phải chắc chắn rằng tiện ích mở rộng tồn tại

Đột biến thay đổi trong PHP 8. 0

Như đã cập nhật chủ đề 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 đột biến thay đổi này đã không còn được sử 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 động của các hàm nội hàm đã được thực hiện tốt nhất

Phân loại cảnh báo - Tí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

This change the change could show the error has been hidden before PHP 8. Please ensure that display_errors=Off on your production server

Default default report

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

PDO default mode

Từ RFC. Default mode mode at for PDO is silent. Điều này có nghĩa là khi lỗi SQL xảy ra, không có lỗi hoặc cảnh báo nào có thể được phát ra và không có trường hợp ngoại lệ nào được đưa ra trừ khi nhà phát triển khai triển xử lý lỗi rõ ràng của riêng họ

RFC change default default will change to PDO. ERRMODE_EXCEPTION trong PHP 8

Ghép nối ưu tiên - Tính năng mới của PHP

Mặc dù đã không còn được sử dụng trong PHP 7. 4, but this change has a effect. Nếu bạn viết một cái gì đó như thế này

tiếng vang "tổng hợp. ". $a + $b;

Trước đây, PHP sẽ diễn giải nó như thế này

tiếng vang ("tổng. ". $a) + $b;

Nhưng giờ, PHP 8 sẽ hiểu như thế này

echo "sum. ". ($a + $b);
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ử . Nhưng giờ thì không còn khả năng thi nữa và sẽ xuất hiện TypeError.

[] % [42];

đối tượng $ + 4;

Tên không gian tên

PHP được sử dụng để diễn giải từng phần của không gian tên (phân tách bằng dấu gạch chéo ngược \) dưới dạng chuỗi mã thông báo. 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 không gian tên

Saner chuỗi số

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

So sánh chuỗi Saner với số

RFC đã giải quyết một trường hợp rất lạ trong PHP đó là công 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 đổi chúng

Thay đổi phản ánh - Tính năng mới của PHP

Một số phương thức phản ánh không được sử dụng nữa

  • Phản ánhChức năng. bị vô hiệu hóa()
  • Thông số phản ánh. getClass()
  • Thông số phản ánh. isCallable()

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

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

Nếu kiểu là kiểu duy nhất, ReflectionParameter. getType() return a instance of ReflectionNamedType, you could

$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 thể thực hiện được bằng kiểm tra thể hiện của

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

// Đó là một loại duy nhất

}

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

// Đó là một kiểu kết hợp

}

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

Phản ÁnhLớp. newInstance($args);

Phản ánhChức năng. gọi($args);

Phương pháp phản chiếu. gọi($object, $args);

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

Phản ÁnhLớp. newInstance(. $args);

Phản ánhChức năng. gọi (. $args);

Phương pháp phản ánh. gọi($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ì hãy làm như sau

Phản ÁnhLớp. newInstance($arg = null,. $args);

Phản ánhChức năng. gọi($arg = null,. $args);

Phương pháp phản chiếu. gọi($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ành 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 thông qua các khóa học lập trình tại T3H.