Php8 có tương thích ngược không?

Một trong những thay đổi mới lớn nhất trong PHP 8 là hỗ trợ Thuộc tính. Các thuộc tính giúp thêm siêu dữ liệu vào các hàm PHP, tham số, lớp, phương thức lớp, hằng số, thuộc tính, bao đóng và thậm chí cả các lớp ẩn danh. Siêu dữ liệu này có thể được tìm nạp theo chương trình và cung cấp một cách tiếp cận thực dụng để giải quyết các thuộc tính ở nơi khác trong mã


Một bài viết chuyên sâu về lịch sử, các cách tiếp cận khác nhau và các trường hợp sử dụng thực tế của Thuộc tính có trong bài viết Thuộc tính trong PHP 8

Cú pháp và cách sử dụng

Các thuộc tính được khai báo với dấu ngoặc nhọn

#[Attr]
#[FooAttr]
function foo(){}

#[Attr, FooAttr]
function bar(){}
6 và
#[Attr]
#[FooAttr]
function foo(){}

#[Attr, FooAttr]
function bar(){}
7

#[ExampleAttribute('foo', 'bar')]
function example() {}

Cú pháp thuộc tính ban đầu được triển khai dưới dạng

#[Attr]
#[FooAttr]
function foo(){}

#[Attr, FooAttr]
function bar(){}
8, tiếp theo là
#[Attr]
#[FooAttr]
function foo(){}

#[Attr, FooAttr]
function bar(){}
9 và cuối cùng là
#[Attribute]
class FooAttribute{

}
0

Trong tất cả các phiên bản PHP,

#[Attribute]
class FooAttribute{

}
1 bắt đầu nhận xét cho phần còn lại của dòng. Khi một thuộc tính được sử dụng trong dòng riêng của nó, nó sẽ không gây ra lỗi cú pháp trong các phiên bản PHP trước 8. 0. Điều này làm cho mã sử dụng PHP 8. 0 tương thích ngược, miễn là mỗi thuộc tính được gán trong dòng riêng của nó, điều này khiến PHP bỏ qua các thuộc tính đó

Các thuộc tính có thể phân giải thành tên lớp

Mặc dù không bắt buộc, PHP 8 cung cấp chức năng phân giải tên thuộc tính thành tên lớp. Bạn có thể sử dụng câu lệnh

#[Attribute]
class FooAttribute{

}
2 để dọn dẹp mã. Các quy tắc tiêu chuẩn về phân giải tên lớp sẽ được tuân theo

Nó là tùy chọn để khớp tên Thuộc tính với tên lớp

Nếu một thuộc tính không ánh xạ tới một lớp, thì Reflection API không cho phép tìm nạp một phiên bản của thuộc tính đã khởi tạo

Thuộc tính có thể có tham số

Mỗi thuộc tính có thể có 0 hoặc nhiều tham số. Chúng sẽ được chuyển đến hàm tạo của lớp Thuộc tính nếu cố lấy một đối tượng khởi tạo của thuộc tính

Tham số có thể là các kiểu vô hướng đơn giản, mảng hoặc thậm chí là các biểu thức đơn giản như biểu thức toán học, hằng số PHP, hằng số lớp (bao gồm cả hằng số ma thuật). Bất kỳ biểu thức nào có thể được sử dụng làm hằng số lớp đều có thể được sử dụng làm Tham số thuộc tính

Cho phép nhiều hơn một thuộc tính

Mỗi mục nhận Thuộc tính có thể có 0 hoặc nhiều thuộc tính, mỗi thuộc tính nằm trong dấu ngoặc đơn

#[Attr]
#[FooAttr]
function foo(){}

#[Attr, FooAttr]
function bar(){}
6
#[Attr]
#[FooAttr]
function foo(){}

#[Attr, FooAttr]
function bar(){}
7 của riêng nó hoặc bên trong cùng dấu ngoặc đơn được phân tách bằng dấu phẩy

Mỗi Thuộc tính có thể được phân tách bằng khoảng trắng (dòng mới hoặc (các) khoảng trắng)

#[Attr]
#[FooAttr]
function foo(){}

#[Attr, FooAttr]
function bar(){}

Theo mặc định, cùng một thuộc tính không được phép sử dụng nhiều lần. Tuy nhiên, có thể khai báo một thuộc tính rõ ràng cho phép sử dụng nhiều lần

Nhận xét trước và sau DocBlock

Các thuộc tính có thể xuất hiện trước và sau các bình luận của DocBlock. Không có đề xuất tiêu chuẩn nào cho kiểu mã, nhưng điều này chắc chắn sẽ được giải quyết trong đề xuất kiểu mã PSR trong tương lai

khai báo thuộc tính

Để sử dụng các thuộc tính, bản thân thuộc tính có thể được khai báo là một lớp. Điều này chỉ được xác thực khi thuộc tính được tìm nạp chứ không phải ngay lập tức khi mã được phân tích cú pháp

Thuộc tính PHP là một lớp PHP tiêu chuẩn, được khai báo với thuộc tính

#[Attribute]
class FooAttribute{

}
0

#[Attribute]
class FooAttribute{

}

Theo mặc định, thuộc tính đã khai báo có thể được sử dụng trên bất kỳ mặt hàng nào chấp nhận thuộc tính. Điều này bao gồm các lớp, phương thức lớp, bao đóng, hàm, tham số và thuộc tính lớp

Khi khai báo thuộc tính có thể khai báo các đích mà thuộc tính phải sử dụng

#[Attr]
#[FooAttr]
function foo(){}

#[Attr, FooAttr]
function bar(){}
3

Khi thuộc tính được gán cho các mục tiêu mà nó hỗ trợ, PHP không cho phép sử dụng thuộc tính cho bất kỳ mục tiêu nào khác. Nó chấp nhận mặt nạ bit để cho phép thuộc tính trong một hoặc nhiều mục tiêu

#[Attr]
#[FooAttr]
function foo(){}

#[Attr, FooAttr]
function bar(){}
4

Nó cho phép các mục tiêu sau

  • #[Attribute]
    class FooAttribute{
    
    }
    6
  • #[Attribute]
    class FooAttribute{
    
    }
    7
  • #[Attribute]
    class FooAttribute{
    
    }
    8
  • #[Attribute]
    class FooAttribute{
    
    }
    9
  • #[Attr]
    #[FooAttr]
    function foo(){}
    
    #[Attr, FooAttr]
    function bar(){}
    30
  • #[Attr]
    #[FooAttr]
    function foo(){}
    
    #[Attr, FooAttr]
    function bar(){}
    31
  • #[Attribute]
    class FooAttribute{
    
    }
    8

#[Attr]
#[FooAttr]
function foo(){}

#[Attr, FooAttr]
function bar(){}
33 là
#[Attr]
#[FooAttr]
function foo(){}

#[Attr, FooAttr]
function bar(){}
34 của tất cả các mục tiêu khác

Lớp #[Attr] #[FooAttr] function foo(){} #[Attr, FooAttr] function bar(){}35 được khai báo #[Attr] #[FooAttr] function foo(){} #[Attr, FooAttr] function bar(){}36

Lớp

#[Attr]
#[FooAttr]
function foo(){}

#[Attr, FooAttr]
function bar(){}
35 được khai báo là
#[Attr]
#[FooAttr]
function foo(){}

#[Attr, FooAttr]
function bar(){}
36, điều này ngăn không cho nó được mở rộng

Thuộc tính lặp lại

Theo mặc định, không được phép sử dụng cùng một thuộc tính trên cùng một mục tiêu nhiều lần. Thuộc tính phải cho phép nó một cách rõ ràng

#[ExampleAttribute('foo', 'bar')]
function example() {}
8

Ví dụ cú pháp thuộc tính

#[ExampleAttribute('foo', 'bar')]
function example() {}
9

Bạn đang tìm các ví dụ chi tiết?
Các thuộc tính trong PHP 8 chứa một số ví dụ khác với các trường hợp cạnh được minh họa.

Tìm nạp thuộc tính

Các thuộc tính được truy xuất bằng API phản chiếu. Khi công cụ PHP phân tích mã có chứa Thuộc tính, chúng được lưu trữ trong các cấu trúc bên trong để sử dụng trong tương lai. Bao gồm hỗ trợ opcache. Nó không thực thi bất kỳ mã nào hoặc gọi hàm tạo của các thuộc tính trừ khi một phiên bản của Thuộc tính được yêu cầu (xem các ví dụ bên dưới)

Sử dụng API phản chiếu, Thuộc tính có thể được truy xuất dưới dạng chuỗi chứa tên Thuộc tính (với tên lớp đã được giải quyết) và các đối số tùy chọn của nó

Reflection API cũng có thể khởi tạo một thể hiện của lớp Thuộc tính, với các tên lớp được phân giải, tự động tải và các tham số tùy chọn được truyền cho hàm tạo của lớp. Việc không khởi tạo lớp sẽ ném ra

#[Attr]
#[FooAttr]
function foo(){}

#[Attr, FooAttr]
function bar(){}
39 ngoại lệ có thể bị bắt ở cấp độ người gọi

Phương pháp #[Attr] #[FooAttr] function foo(){} #[Attr, FooAttr] function bar(){}40 mới

#[Attr]
#[FooAttr]
function foo(){}

#[Attr, FooAttr]
function bar(){}
2

Tất cả các lớp

#[Attr]
#[FooAttr]
function foo(){}

#[Attr, FooAttr]
function bar(){}
41 đều có một phương thức mới là phương thức
#[Attr]
#[FooAttr]
function foo(){}

#[Attr, FooAttr]
function bar(){}
42, phương thức này trả về một mảng gồm các đối tượng
#[Attr]
#[FooAttr]
function foo(){}

#[Attr, FooAttr]
function bar(){}
43. Một bản tóm tắt của phương pháp mới này sẽ tương tự như sau

#[Attr]
#[FooAttr]
function foo(){}

#[Attr, FooAttr]
function bar(){}
6

Tóm tắt lớp học #[Attr] #[FooAttr] function foo(){} #[Attr, FooAttr] function bar(){}43

#[Attr]
#[FooAttr]
function foo(){}

#[Attr, FooAttr]
function bar(){}
8

lọc thuộc tính

#[Attr]
#[FooAttr]
function foo(){}

#[Attr, FooAttr]
function bar(){}
40 tùy ý chấp nhận một chuỗi tên lớp có thể được sử dụng để lọc mảng thuộc tính trả về theo một tên Thuộc tính nhất định

#[Attr]
#[FooAttr]
function foo(){}

#[Attr, FooAttr]
function bar(){}
0

Mảng

#[Attr]
#[FooAttr]
function foo(){}

#[Attr, FooAttr]
function bar(){}
46 bây giờ sẽ chỉ là đối tượng
#[Attr]
#[FooAttr]
function foo(){}

#[Attr, FooAttr]
function bar(){}
43 hoặc tên thuộc tính
#[Attr]
#[FooAttr]
function foo(){}

#[Attr, FooAttr]
function bar(){}
48

Tham số tùy chọn thứ hai chấp nhận một số nguyên để tinh chỉnh thêm mảng trả về

#[Attr]
#[FooAttr]
function foo(){}

#[Attr, FooAttr]
function bar(){}
1

Hiện tại, chỉ có

#[Attr]
#[FooAttr]
function foo(){}

#[Attr, FooAttr]
function bar(){}
49

Nếu

#[Attr]
#[FooAttr]
function foo(){}

#[Attr, FooAttr]
function bar(){}
49 được thông qua, mảng trả về sẽ chứa Thuộc tính có cùng tên lớp hoặc các lớp mà
#[ExampleAttribute('foo', 'bar')]
function example() {}
81 hoặc
#[ExampleAttribute('foo', 'bar')]
function example() {}
82 tên được cung cấp (i. tất cả các lớp đáp ứng ______ 283)

Truy xuất các đối tượng thuộc tính

Phương thức

#[ExampleAttribute('foo', 'bar')]
function example() {}
84 trả về một thể hiện của lớp Thuộc tính, với bất kỳ tham số nào được truyền cho hàm tạo của lớp đối tượng Thuộc tính

Một ví dụ hoàn chỉnh

#[Attr]
#[FooAttr]
function foo(){}

#[Attr, FooAttr]
function bar(){}
2

Đọc chuyên sâu. Đây là một bản tóm tắt ngắn về tính năng Thuộc tính mới trong PHP 8. Để có hướng dẫn chi tiết, hãy xem Thuộc tính trong PHP 8


Tác động tương thích ngược

Cú pháp cuối cùng của tính năng Thuộc tính không tương thích ngược. Tuy nhiên, vì ký tự

#[Attribute]
class FooAttribute{

}
1 là ký hiệu hợp lệ để bắt đầu nhận xét, một thuộc tính được khai báo trên dòng riêng của nó có thể khiến mã được phân tích cú pháp và chạy trên các phiên bản PHP cũ hơn

Các phiên bản PHP có tương thích ngược không?

php không có khả năng tương thích ngược trong tất cả các phiên bản . Nó thường loại bỏ một số chức năng khi nó thay đổi phiên bản. Sự cố xảy ra khi bạn phải nâng cấp máy chủ và cần thay đổi phiên bản php nhưng một số tập lệnh php không còn hoạt động với phiên bản php mới. Bạn cũng phải sửa tập lệnh php, đây là một công việc lớn hơn.

Tôi nên sử dụng PHP 7 hay 8?

Ngoài ra, phiên bản PHP mới hơn hoạt động tốt hơn các phiên bản cũ. Sự gia tăng đáng kể về hiệu suất và bảo mật có thể là tất cả những gì cần thiết để cải thiện và đảm bảo trải nghiệm người dùng tích cực trên trang web của bạn. PHP 8 nhanh hơn đáng kể so với PHP 7 theo nhiều tiêu chuẩn web khác nhau.

PHP 8 và PHP 7 khác nhau ở điểm nào?

PHP 7 hỗ trợ đối số tên, có nghĩa là nó chuyển các giá trị bằng tên tham số. PHP 8 chỉ định các tham số bắt buộc và đối số là độc lập. PHP 7 có chức năng thêm siêu dữ liệu vào mã. Trong PHP 8, thay vì chú thích, chúng ta có thể sử dụng siêu dữ liệu có cấu trúc

Điều gì không được dùng trong php8?

Khi khai báo hàm hoặc phương thức, việc thêm tham số bắt buộc sau tham số tùy chọn không được dùng nữa kể từ PHP 8. 0. Cần kiểm tra mã trong khai báo các hàm và phương thức và các cuộc gọi của chúng.