Giới thiệu
Trong lập trình, phạm vi (scope) chỉ mức độ biến có thể truy cập. Thông thường, script PHP đơn giản (không có vòng lặp, hàm...) có phạm vi đơn giản: biến khả dụng toàn bộ chương trình từ điểm định nghĩa.
Biến trong script chính cũng có sẵn cho script khác include/require. Ví dụ test.php include vào script chính:
Script chính:
$var = 100; include "test.php";
File test.php include:
echo "value of \$var in testscript.php: " . $var;
Kết quả:
value of $var in testscript.php: 100
Tuy nhiên, khi script có hàm user-defined, biến bên trong có phạm vi cục bộ (local). Do đó biến định nghĩa trong hàm không truy cập được bên ngoài. Biến định nghĩa ngoài (trên) hàm có phạm vi toàn cục (global).
Ví dụ
<?php $var = 100; // global function myfunction() { $var1 = "Hello"; // local echo "var=$var var1=$var1\n"; } myfunction(); echo "var=$var var1=$var1\n"; ?>Kết quả
var= var1=Hello var=100 var1= PHP Notice: Undefined variable: var in line 5 PHP Notice: Undefined variable: var1 in line 8
Lưu ý: biến toàn cục không tự động có sẵn trong phạm vi cục bộ của hàm. Biến trong hàm cũng không truy cập được bên ngoài.
Từ khóa global
Truy cập biến toàn cục trong phạm vi cục bộ phải bật rõ ràng bằng từ khóa global:
Ví dụ
<?php $a = 10; $b = 20; echo "before function call a = $a b = $b\n"; function myfunction() { global $a, $b; $c = ($a + $b) / 2; echo "inside function a = $a b = $b c = $c\n"; $a = $a + 10; } myfunction(); echo "after function a = $a b = $b c = $c"; ?>Kết quả
before function call a = 10 b = 20 inside function a = 10 b = 20 c = 15 PHP Notice: Undefined variable: c in line 13 after function a = 20 b = 20 c =
Biến toàn cục giờ xử lý được trong hàm. Thay đổi biến toàn cục trong hàm phản ánh ra không gian tên toàn cục.
Mảng $GLOBALS
PHP lưu tất cả biến toàn cục trong mảng liên kết $GLOBALS. Tên và giá trị biến tạo cặp khóa-giá trị.
Script PHP dùng $GLOBALS truy cập biến toàn cục:
Ví dụ
<?php $a = 10; $b = 20; echo "before function call a = $a b = $b\n"; function myfunction() { $c = ($GLOBALS['a'] + $GLOBALS['b']) / 2; echo "c = $c\n"; $GLOBALS['a'] += 10; } myfunction(); echo "after function a = $a b = $b c = $c"; ?>Kết quả
before function call a = 10 b = 20 c = 15 PHP Notice: Undefined variable: c line 12 after function a = 20 b = 20 c =
Biến static
Biến định nghĩa với từ khóa static không khởi tạo lại mỗi lần gọi hàm. Nó giữ giá trị lần gọi trước.
Ví dụ
<?php function myfunction() { static $x = 0; echo "x = $x\n"; $x++; } for ($i = 1; $i <= 3; $i++) { echo "call to function :$i: "; myfunction(); } ?>Kết quả
call to function :1: x = 0 call to function :2: x = 1 call to function :3: x = 2