Phạm vi có thể được định nghĩa là phạm vi khả dụng của một biến đối với chương trình mà nó được khai báo. Các biến PHP có thể là một trong bốn loại phạm vi -
- Biến cục bộ
- thông số chức năng
- biến toàn cầu
- biến tĩnh
Loại phạm vi biến cuối cùng mà tôi thảo luận được gọi là tĩnh. Ngược lại với các biến được khai báo là tham số của hàm, bị hủy khi hàm thoát, một biến tĩnh sẽ không mất giá trị khi hàm thoát và sẽ vẫn giữ giá trị đó nếu hàm được gọi lại
Bạn có thể khai báo một biến là tĩnh đơn giản bằng cách đặt từ khóa STATIC trước tên biến
Từ khóa static
được sử dụng để khai báo các thuộc tính và phương thức của một lớp là tĩnh. Các thuộc tính và phương thức tĩnh có thể được sử dụng mà không cần tạo một thể hiện của lớp
Từ khóa static
cũng được sử dụng để khai báo các biến trong hàm giữ nguyên giá trị của chúng sau khi hàm kết thúc
Một bản cập nhật kín đáo của PHP 8. 1 là nâng cấp hành vi biến tĩnh PHP trong các lớp. Biến tĩnh trong kế thừa phương thức. Hãy cùng xem lại các biến tĩnh trong PHP là gì, tại sao chúng lại có vấn đề cho đến nay và các chiến lược nâng cấp mã để loại bỏ vấn đề này
Biến tĩnh PHP
Mặc dù các thuộc tính và phương thức tĩnh khá được biết đến, nhưng các biến tĩnh lại là một bí mật. Họ trông như thế này trong mã
Trái ngược với các biến thông thường, biến tĩnh sẽ không chết khi kết thúc lệnh gọi hàm và vẫn tồn tại cho đến lần gọi tiếp theo. Đây là cách hàm trong ví dụ tiếp tục trả về $count
sau khi tăng và mỗi lần nó hiển thị một giá trị khác nhau
Các biến tĩnh thuận tiện khi bạn cần giữ một số giá trị trong các cuộc gọi và giá trị này chỉ hữu ích cho chức năng này
Các biến tĩnh kế thừa
Các biến tĩnh có sẵn trong các phương thức, mặc dù trước đây chúng hoạt động khá bất ngờ. Chúng thực sự được tạo cho mỗi lớp từ nơi chúng được gọi. Chúng có thể kết thúc dưới dạng nhiều phiên bản, mặc dù, chúng chỉ được xác định một lần. Xem nó từ ví dụ này của Nikita Popov
Biến tĩnh được sử dụng trong các lớp A và B, nhưng phương thức này được kế thừa nên nó thực sự là cùng một mã được gọi. Cho đến PHP 8. 0, sẽ có một biến tĩnh riêng biệt tùy thuộc vào lớp nào được gọi
Điều này đã được sửa trong PHP 8. 1, trong đó hành vi bây giờ giống với thuộc tính tĩnh. các biến hiện được chia sẻ giữa các phương thức B::counter[]
và A::counter
và cả hai đều giống nhau
Lỗi này sẽ xảy ra khi một phương thức của một lớp được kế thừa bởi một phương thức khác và cũng sử dụng các biến tĩnh. Như chúng tôi đã đề cập ban đầu, điều này khá hiếm và việc gọi một phương thức tĩnh với các lớp khác nhau cũng khá hiếm, vì vậy đây có thể là một vấn đề khá hiếm gặp.
Điều đó có nghĩa là nó sẽ khá khó hiểu khi nó phát sinh. Vì vậy, có một quy tắc Exakat chuyên dụng được gọi là Biến tĩnh kế thừa để phát hiện chúng trong mã của bạn. Đây là một phần của Migration PHP 8. 1 bộ quy tắc
Nâng cấp biến tĩnh thành thuộc tính tĩnh
Một trong những ưu điểm chính của các biến tĩnh là chúng vô hình từ bên ngoài. Phương pháp hoạt động như một hộp đen từ bên ngoài
Điều này thường tốt trong phiên bản ban đầu của mã, cho đến khi nhu cầu xem chính giá trị xuất hiện. Sau đó, một người phụ thuộc vào chính phương thức đó để cung cấp cách truy cập nó, điều này không bao giờ thuận tiện
Vì vậy, một cách dễ dàng để nâng cấp một biến tĩnh là biến nó thành một thuộc tính. Thuộc tính hiện được lưu trữ bên ngoài phương thức và bên trong lớp nhưng có sẵn trên nhiều cuộc gọi. Nó cũng có sẵn cho pháp y bổ sung và chào mời, như với một getter đơn giản
Lưu ý rằng giải pháp này chuyển biến tĩnh thành thuộc tính bình thường. biến tĩnh thành thuộc tính tĩnh là có thể. Ở đây, nó sẽ chia sẻ bộ đếm trên TẤT CẢ các đối tượng, đây không phải là hiệu ứng mong muốn
Tiêm biến tĩnh
Một tùy chọn khác là di chuyển biến tĩnh dưới dạng tiêm và luôn cung cấp nó làm đối số cho phương thức. Về cơ bản, thay vì lưu trữ biến trong đối tượng hiện tại, giờ đây nó được lưu trữ trong ngữ cảnh gọi, ngữ cảnh này có trách nhiệm tạo và cung cấp biến đó mỗi lần
Ví dụ này vẫn là ví dụ truy cập ban đầu nên hơi đơn giản và cũng cần tham chiếu để tránh mất giá trị trong phương thức. Nó sẽ hoàn toàn khác với một đối tượng Counter
Sự bất tiện chính của phương pháp này là sự cần thiết của ngữ cảnh gọi [ở đây là toàn cầu] để duy trì đối tượng này cho đến khi hoàn thành
Một lỗi ít hơn trong mã của tôi
PHP8. 1 đã mang đến một danh sách khá hay về quá trình phát triển và sửa lỗi. các biến tĩnh kế thừa là một trong số chúng. Nó khá hiếm, nhưng cũng khá khó hiểu. Giải pháp thay thế cũng đủ đơn giản để bạn thực sự có thể chuẩn bị mã của mình bằng cách kiểm tra tính tương thích của nó với PHP 8. 1 với exakat, sau đó, quyết định cách thực hiện nâng cấp này. Ngay cả khi nâng cấp này không phải là bước tiếp theo của bạn, nó sẽ giúp mã an toàn hơn để nâng cấp sau này