Vì có nhiều thay đổi quan trọng mà chúng tôi muốn nói đến, nên chúng tôi đã chia blog này thành nhiều phần. Đây là phần 1 của loạt bài
Các vấn đề với mã cũ
Với PHP 8, chúng ta không nên nghĩ rằng nó sẽ tương thích ngược nữa vì nó có một loạt các thay đổi về cú pháp. Những thay đổi mới nhất bao gồm
- Di sản trích dẫn ma thuật
- loại thực
- Các phương thức xuất phản chiếu []
- Bỏ ràng buộc $this khỏi các lần đóng không tĩnh
- implode[] hỗn hợp thứ tự tham số
- hàm hebrevc[]
- mb_strpos[] với mã hóa làm đối số thứ 3
- hàm money_format[]
- hàm convert_cyr_string[]
- allow_url_include trong chỉ thị
- hàm restore_include_path[]
Chúng ta hãy xem các tính năng chính của PHP 8
chức năng mới
str_contains[]
Khi cố gắng tìm hiểu xem một chuỗi có phải là một phần của chuỗi khác hay không, thông thường bạn sẽ sử dụng hàm str_pos[] sử dụng cái kim trong khái niệm đống cỏ khô. Nó trả về một số nguyên hiển thị vị trí đầu tiên mà bạn nhìn thấy kim. Khi nó trả về vị trí của một chuỗi, bạn không thể kiểm tra xem strpos[] có phát hiện ra nó hay không; .
Điều này có nghĩa là bạn sẽ phải bọc nó trong một điều kiện chẳng hạn như “strpos[$haystack, $needle]. == sai. ” Trường hợp sai nghĩa là không tìm thấy vị trí của chuỗi.
Để chống lại điều này, PHP 8 giới thiệu hàm str_contains[], hàm này trả về một giá trị boolean đơn giản cho biết liệu cái kim có trong đống rơm hay không
Vì vậy, thay vì làm điều này
if [strpos['string with lots of words', 'words'] !== false] { /* … */ }
Bây giờ bạn sẽ làm điều này
if [str_contains['string with lots of words', 'words']] { /* … */ }
các hàm str_starts_with[] và str_ends_with[].
Các chức năng này hiện được tích hợp vào lõi
str_starts_with['haystack', 'hay']; // true
str_ends_with['haystack', 'stack']; // true
hàm fdiv[]
Hàm fdiv[] mới thực hiện điều gì đó 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[]
Hàm get_debug_type[] trả về kiểu của một biến. get_debug_type[] trả về kết quả hữu ích hơn cho mảng, chuỗi, lớp ẩn danh và đối tượng. Chắc chắn nó giống như gettype[] nhưng có những lợi ích sau này.
Ví dụ. gọi gettype[] trên một lớp \Foo\Bar sẽ trả về đối tượng. Sử dụng get_debug_type[] sẽ trả về tên lớp
hàm get_resource_id[]
Tài nguyên là biến đặc biệt trong PHP, đề cập đến 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à xử lý 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 sang int
$resourceId = [int] $resource;
PHP 8 thêm các 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];
đối số được đặt tên
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ị, để 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',
];
Thuộc tính của hàm tạo
Sự thay đổi cú pháp này cho phép chúng ta tạo các đối tượng truyền dữ liệu. Thay vì chỉ định các thuộc tính lớp và hàm tạo cho chúng, giờ đây PHP có thể kết hợp chúng thành một
Vì vậy, thay vì làm điều này
class Money
{
public Currency $currency;
public int $amount;
public function __construct[
Currency $currency,
int $amount,
] {
$this->currency = $currency;
$this->amount = $amount;
}
}
Bạn có thể làm được việc này
class Money
{
public function __construct[
public Currency $currency,
public int $amount,
] {}
}
Các thuộc tính cho phép chúng ta khai báo siêu dữ liệu cho các hàm, lớp, thuộc tính và tham số của chúng ta. Thuộc tính ánh xạ tới tên lớp PHP [được khai báo bằng chính Thuộc tính] và chúng có thể được tìm nạp theo chương trình bằng API phản chiếu PHP.
________số 8_______Điều này cho phép chúng tôi dễ dàng khai báo các thuộc tính/chú thích mà trước đây yêu cầu lưu trữ chúng trong các phần tử khối tài liệu và phân tích cú pháp chuỗi để suy ra chúng.
Toán tử an toàn null
Toán tử hợp nhất null tương tự như toán tử bậc ba nhưng sẽ hoạt động giống như một tập hợp trên toán hạng bên trái thay vì chỉ sử dụng giá trị boolean của nó. Điều này làm cho toán tử này đặc biệt hữu ích cho các mảng và gán giá trị mặc định khi một biến không được đặt
Nó không hoàn toàn đáng tin cậy vì 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 trình trợ giúp tùy chọn do một số khung cung cấp
$startDate = $booking->getStartDate[];
$dateAsString = $startDate ? $startDate->asDateTimeString[] : null;
Với việc bổ sung toán tử an toàn null, giờ đây chúng ta có thể có hành vi giống như kết hợp null trên các phương thức
if [str_contains['string with lots of words', 'words']] { /* … */ }
0các loại công đoàn
Các loại liên kết là tập hợp của hai hoặc nhiều loại cho biết rằng một trong hai loại đó có thể được sử dụng
if [str_contains['string with lots of words', 'words']] { /* … */ }
1Lưu ý rằng void không bao giờ có thể là một phần của kiểu kết hợp vì nó biểu thị "không có giá trị trả về nào cả". Hơn nữa, các hiệp hội nullable có thể được viết bằng cách sử dụng. null hoặc bằng cách sử dụng hiện có?
if [str_contains['string with lots of words', 'words']] { /* … */ }
2if [str_contains['string with lots of words', 'words']] { /* … */ }
3Trình biên dịch JIT
PHP Opcache hỗ trợ JIT. Nó bị tắt theo mặc định và nếu được bật, JIT sẽ biên dịch và lưu trữ các hướng dẫn gốc. Nó không tạo ra sự khác biệt đáng chú ý trong các ứng dụng web liên kết với IO nhưng cung cấp khả năng tăng hiệu suất cho các ứng dụng nặng về CPU
Sự khác biệt giữa php7 và PHP 8 là gì?
Tôi nên sử dụng PHP 7 hay 8?
Điều gì đã thay đổi trong PHP 8?
Cách nâng cấp PHP 7. 4 đến 8?