Phạm vi của một biến là bối cảnh trong đó nó được xác định. Đối với hầu hết các biến PHP chỉ có một phạm vi duy nhất. Phạm vi duy nhất này cũng bao gồm các tệp được yêu cầu và bao gồm. Ví dụ
Static object: NULL Static object: NULL Static object: NULL Static object: object[stdClass]#3 [1] { ["property"]=> int[1] }2
Ở đây, biến $a sẽ có sẵn trong b được bao gồm. tập lệnh inc. Tuy nhiên, trong các chức năng do người dùng xác định, phạm vi chức năng cục bộ được giới thiệu. Theo mặc định, bất kỳ biến nào được sử dụng bên trong hàm đều được giới hạn trong phạm vi hàm cục bộ. Ví dụ
Static object: NULL Static object: NULL Static object: NULL Static object: object[stdClass]#3 [1] { ["property"]=> int[1] }3
Static object: NULL Static object: NULL Static object: NULL Static object: object[stdClass]#3 [1] { ["property"]=> int[1] }4
Static object: NULL Static object: NULL Static object: NULL Static object: object[stdClass]#3 [1] { ["property"]=> int[1] }5
Tập lệnh này sẽ không tạo ra bất kỳ đầu ra nào vì câu lệnh echo đề cập đến phiên bản cục bộ của biến $a và nó chưa được gán giá trị trong phạm vi này. Bạn có thể nhận thấy rằng ngôn ngữ này hơi khác một chút so với ngôn ngữ C ở chỗ các biến toàn cục trong C tự động có sẵn cho các hàm trừ khi bị ghi đè cụ thể bởi một định nghĩa cục bộ. Điều này có thể gây ra một số vấn đề trong đó mọi người có thể vô tình thay đổi một biến toàn cầu. Trong PHP các biến toàn cục phải được khai báo toàn cục bên trong một hàm nếu chúng sẽ được sử dụng trong hàm đó
Từ khóa Static object: NULL
Static object: NULL
Static object: NULL
Static object: object[stdClass]#3 [1] {
["property"]=>
int[1]
}
6
Đầu tiên, một ví dụ sử dụng của
Static object: NULL Static object: NULL Static object: NULL Static object: object[stdClass]#3 [1] { ["property"]=> int[1] }6
Ví dụ #1 Sử dụng
Static object: NULL Static object: NULL Static object: NULL Static object: object[stdClass]#3 [1] { ["property"]=> int[1] }6
Static object: NULL Static object: NULL Static object: NULL Static object: object[stdClass]#3 [1] { ["property"]=> int[1] }9
Static object: NULL Static object: NULL Static object: NULL Static object: object[stdClass]#3 [1] { ["property"]=> int[1] }0
Static object: NULL Static object: NULL Static object: NULL Static object: object[stdClass]#3 [1] { ["property"]=> int[1] }1
Static object: NULL Static object: NULL Static object: NULL Static object: object[stdClass]#3 [1] { ["property"]=> int[1] }2
Đoạn script trên sẽ xuất ra
Static object: NULL Static object: NULL Static object: NULL Static object: object[stdClass]#3 [1] { ["property"]=> int[1] }3. Bằng cách khai báo $a và $b toàn cầu trong hàm, tất cả các tham chiếu đến một trong hai biến sẽ tham chiếu đến phiên bản toàn cầu. Không có giới hạn về số lượng biến toàn cục có thể được thao tác bởi một hàm
Cách thứ hai để truy cập các biến từ phạm vi toàn cục là sử dụng mảng đặc biệt $GLOBALS do PHP định nghĩa. Ví dụ trước có thể được viết lại thành
Ví dụ #2 Sử dụng $GLOBALS thay vì toàn cục
Static object: NULL Static object: NULL Static object: NULL Static object: object[stdClass]#3 [1] { ["property"]=> int[1] }9
Static object: NULL Static object: NULL Static object: NULL Static object: object[stdClass]#3 [1] { ["property"]=> int[1] }5
Static object: NULL Static object: NULL Static object: NULL Static object: object[stdClass]#3 [1] { ["property"]=> int[1] }2
Mảng $GLOBALS là một mảng kết hợp với tên của biến toàn cục là khóa và nội dung của biến đó là giá trị của phần tử mảng. Lưu ý cách $GLOBALS tồn tại trong bất kỳ phạm vi nào, điều này là do $GLOBALS là một siêu toàn cầu. Đây là một ví dụ chứng minh sức mạnh của siêu toàn cầu
Ví dụ #3 Ví dụ minh họa siêu toàn cầu và phạm vi
Static object: NULL Static object: NULL Static object: NULL Static object: object[stdClass]#3 [1] { ["property"]=> int[1] }7
Ghi chú
Sử dụng từ khóa
Static object: NULL Static object: NULL Static object: NULL Static object: object[stdClass]#3 [1] { ["property"]=> int[1] }6 bên ngoài chức năng không phải là lỗi. Nó có thể được sử dụng nếu tệp được bao gồm từ bên trong một chức năng
Sử dụng biến Static object: NULL
Static object: NULL
Static object: NULL
Static object: object[stdClass]#3 [1] {
["property"]=>
int[1]
}
9
Một tính năng quan trọng khác của phạm vi biến là biến tĩnh. Một biến tĩnh chỉ tồn tại trong phạm vi chức năng cục bộ, nhưng nó không mất giá trị khi thực thi chương trình rời khỏi phạm vi này. Xem xét ví dụ sau
Ví dụ #4 Ví dụ chứng minh sự cần thiết của các biến tĩnh
Static object: NULL Static object: NULL Static object: NULL Static object: object[stdClass]#3 [1] { ["property"]=> int[1] }20
Hàm này khá vô dụng vì mỗi khi nó được gọi, nó đặt $a thành
Static object: NULL Static object: NULL Static object: NULL Static object: object[stdClass]#3 [1] { ["property"]=> int[1] }21 và in ra
Static object: NULL Static object: NULL Static object: NULL Static object: object[stdClass]#3 [1] { ["property"]=> int[1] }21. $a++ làm tăng biến không có mục đích gì vì ngay sau khi hàm thoát, biến $a sẽ biến mất. Để tạo một hàm đếm hữu ích mà không mất dấu vết của số đếm hiện tại, biến $a được khai báo là tĩnh
Ví dụ #5 Ví dụ sử dụng các biến tĩnh
Static object: NULL Static object: NULL Static object: NULL Static object: object[stdClass]#3 [1] { ["property"]=> int[1] }23
Bây giờ, $a chỉ được khởi tạo trong lần gọi hàm đầu tiên và mỗi khi hàm
Static object: NULL Static object: NULL Static object: NULL Static object: object[stdClass]#3 [1] { ["property"]=> int[1] }24 được gọi, nó sẽ in giá trị của $a và tăng giá trị đó
Các biến tĩnh cũng cung cấp một cách để xử lý các hàm đệ quy. Hàm đệ quy là hàm gọi chính nó. Phải cẩn thận khi viết một hàm đệ quy vì có thể làm cho nó lặp lại vô thời hạn. Bạn phải chắc chắn rằng bạn có một cách thích hợp để chấm dứt đệ quy. Hàm đơn giản sau đếm đệ quy đến 10, sử dụng biến tĩnh $count để biết khi nào nên dừng
Ví dụ #6 Biến tĩnh với hàm đệ quy
Static object: NULL Static object: NULL Static object: NULL Static object: object[stdClass]#3 [1] { ["property"]=> int[1] }25
Static object: NULL Static object: NULL Static object: NULL Static object: object[stdClass]#3 [1] { ["property"]=> int[1] }26
Biến tĩnh có thể được gán giá trị là kết quả của biểu thức hằng, nhưng biểu thức động, chẳng hạn như lời gọi hàm, sẽ gây ra lỗi phân tích cú pháp
Ví dụ #7 Khai báo biến tĩnh
Static object: NULL Static object: NULL Static object: NULL Static object: object[stdClass]#3 [1] { ["property"]=> int[1] }27
Static object: NULL Static object: NULL Static object: NULL Static object: object[stdClass]#3 [1] { ["property"]=> int[1] }28
Kể từ PHP 8. 1. 0, khi một phương thức sử dụng các biến tĩnh được kế thừa [nhưng không bị ghi đè], phương thức được kế thừa sẽ chia sẻ các biến tĩnh với phương thức cha. Điều này có nghĩa là các biến tĩnh trong các phương thức giờ đây hoạt động giống như các thuộc tính tĩnh
Ví dụ #8 Cách sử dụng Biến tĩnh trong Phương thức kế thừa
Static object: NULL Static object: NULL Static object: NULL Static object: object[stdClass]#3 [1] { ["property"]=> int[1] }29
Ghi chú
Khai báo tĩnh được giải quyết trong thời gian biên dịch
Tham chiếu với biến Static object: NULL
Static object: NULL
Static object: NULL
Static object: object[stdClass]#3 [1] {
["property"]=>
int[1]
}
6 và Static object: NULL
Static object: NULL
Static object: NULL
Static object: object[stdClass]#3 [1] {
["property"]=>
int[1]
}
9
PHP triển khai công cụ sửa đổi tĩnh và toàn cầu cho các biến theo tham chiếu. Ví dụ: một biến toàn cục thực được nhập bên trong phạm vi hàm với câu lệnh
Static object: NULL Static object: NULL Static object: NULL Static object: object[stdClass]#3 [1] { ["property"]=> int[1] }6 thực sự tạo tham chiếu đến biến toàn cục. Điều này có thể dẫn đến hành vi không mong muốn mà ví dụ sau giải quyết
Static object: NULL Static object: NULL Static object: NULL Static object: object[stdClass]#3 [1] { ["property"]=> int[1] }33
Static object: NULL Static object: NULL Static object: NULL Static object: object[stdClass]#3 [1] { ["property"]=> int[1] }34
Static object: NULL Static object: NULL Static object: NULL Static object: object[stdClass]#3 [1] { ["property"]=> int[1] }35
Ví dụ trên sẽ xuất ra
NULL object[stdClass]#1 [0] { }
Một hành vi tương tự áp dụng cho câu lệnh
Static object: NULL Static object: NULL Static object: NULL Static object: object[stdClass]#3 [1] { ["property"]=> int[1] }9. Tài liệu tham khảo không được lưu trữ tĩnh
Static object: NULL Static object: NULL Static object: NULL Static object: object[stdClass]#3 [1] { ["property"]=> int[1] }37
Static object: NULL Static object: NULL Static object: NULL Static object: object[stdClass]#3 [1] { ["property"]=> int[1] }38
Static object: NULL Static object: NULL Static object: NULL Static object: object[stdClass]#3 [1] { ["property"]=> int[1] }39
Static object: NULL Static object: NULL Static object: NULL Static object: object[stdClass]#3 [1] { ["property"]=> int[1] }40
Static object: NULL Static object: NULL Static object: NULL Static object: object[stdClass]#3 [1] { ["property"]=> int[1] }41
Ví dụ trên sẽ xuất ra
Static object: NULL Static object: NULL Static object: NULL Static object: object[stdClass]#3 [1] { ["property"]=> int[1] }
Ví dụ này chứng minh rằng khi gán một tham chiếu cho một biến tĩnh, nó sẽ không được ghi nhớ khi bạn gọi hàm
Static object: NULL Static object: NULL Static object: NULL Static object: object[stdClass]#3 [1] { ["property"]=> int[1] }42 lần thứ hai