上一篇了解到PHP的基本語法與變數,事不宜遲,接下來就要更深入了解變數的變數範圍。
變數範圍(scope)
變數的範圍會影響在程式的可見性與週期。
分為全域變數、區域變數以及在其他語言比較少被提及的靜態變數。

全域變數(global variable)
在函數外部宣告的變數為全域變數,宣告方式無需使用特殊關鍵字,除了函式和類別內部,整個PHP檔案的其他部份都可以讀取這個變數。
<?php
$a = 5;//全域變數
$b = 6;//全域變數
function test(){
echo $a+$b;
}
echo $a+$b;//輸出 11
test()
/*
警告:未定義變數 $a,位於D:\xampp\htdocs\test\test2.php第6行。
警告:未定義變數 $b,位於D:\xampp\htdocs\test\test2.php第6行。
*/
?>
區域變數(local variable)
在函數內部宣告的變數為區域變數,宣告方式無需使用特殊關鍵字,且只能在函數或類別內部使用(不同的function可宣告相同名稱的區域變數),當宣告變數的function結束時代表該變數的生命週期結束,而想要在區域範圍內讀取全域變數可透過以下三種方法讀取:
透過函式參數傳遞
當函式被呼叫時,傳入全域變數進入區域範圍變成區域變數。
<?php
$a = 5;//全域變數
$b = 6;//全域變數
function test($a, $b){
echo $a+$b;//輸出 11
}
test($a, $b);
?>
global關鍵字
把全域變數拉進來,在此修改$b,全域變數$b也會改變。
<?php
$a = 5;//全域變數
$b = 6;//全域變數
function test(){
$a = 10;//區域變數
$b = 13;//區域變數
echo $a+$b;//輸出 23
global $a;//在區域範圍存取全域變數
global $b;//在區域範圍存取全域變數
echo $a+$b;//輸出 11
}
echo $a+$b;//輸出 11
test();
?>
GLOBALS陣列
$GLOBALS 是PHP的一個超級全域變數,用來記錄各種全域變數的一個陣列,在所有作用域都可以被讀取。
<?php
$a = 5;
$b = 6;
function test(){
$a = 10;
$b = 13;
echo $a+$b;//輸出 23
echo $GLOBALS['a']+$GLOBALS['b'];//輸出 11
}
echo $a+$b;//輸出 11
test();
echo $a+$b;//輸出 11
?>
靜態變數(static variable)
在區域變數的部分提到,當function執行結束時代表著區域變數的生命週期結束,不過有時候希望區域變數不因function結束而消滅,這時就可以在第一次宣告該區域變數前加上 static 關鍵字,接下來每次呼叫function時都能包含上次執行所得到的值,加入關鍵字後生命週期變成PHP程式執行完才結束。
<?php
function test(){
$a = 10;
$b = 13;
static $c = 0;
echo $c;
$c++;
}
test();//輸出 0
test();//輸出 1
test();//輸出 2
?>
超全域變數(Superglobals)
PHP內建一系列全域變數,稱為超全域變數,無需使用 global $variable 即可讀取。
(程式碼僅測試學習用,暫不考慮資安問題)
$GLOBALS
儲存各種全域變數的關聯陣列,依鍵值(變數名稱)取值,在所有作用域都可以被讀取。
<?php
$a = 5;
$b = 6;
function test(){
$a = 10;
$b = 13;
echo $a+$b;//輸出 23
echo $GLOBALS['a']+$GLOBALS['b'];//輸出 11
}
echo $a+$b;//輸出 11
test();
echo $a+$b;//輸出 11
?>
$_SERVER
儲存與伺服器相關的變數,例如伺服器名稱、當前程式執行路徑與文件根目錄等等。
詳情可參考官方文檔 : https://www.php.net/manual/zh/reserved.variables.server.php
<?php
echo $_SERVER ['PHP_SELF'] ;//當前程式執行路徑
echo $_SERVER ['SERVER_NAME'] ;//伺服器名稱
echo $_SERVER ['HTTP_HOST'] ;//來自目前請求標頭(Header)的 Host 內容(包含埠號,如 :8080)。
echo $_SERVER ['SCRIPT_NAME'] ;//當前程式執行路徑
echo $_SERVER ['DOCUMENT_ROOT'];//文件根目錄
?>
$_REQUEST
該超全域變數包含 : $_GET、$_POST 和 $_COOKIE。
<?php
echo $_REQUEST["pw"];
?>
$_POST
常用於收集表單的傳遞的資料,以下範例透過<form></form>標籤示範,將資料放在HTTP傳輸封包的body中送出。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<form action="http://localhost:8080/test/test2.php" method = "POST">
<label>password</label>
<input type="text" name="pw">
<br>
<button>Login</button>
</form>
</body>
</html>
將資料透過POST方法傳遞到test2.php。
<?php
echo $_POST["pw"];
?>
可以看到網址的尾巴並沒有剛剛傳遞過來的參數。

$_GET
常用於收集表單的傳遞的資料,將資料放在請求網址的網址參數列 ( URL GET parameters ) 送出。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<form action="http://localhost:8080/test/test2.php" method = "GET">
<label>password</label>
<input type="text" name="pw">
<br>
<button>Login</button>
</form>
</body>
</html>
將資料透過GET方法傳遞到test2.php。
<?php
echo $_GET["pw"];
?>
可以看到網址的尾巴有剛剛傳遞過來的參數。

$_FILES
儲存透過表格HTTP POST方法傳送檔案的資訊,是一個關聯陣列,包含檔案原始名稱、檔案類型、檔案大小、錯誤代碼與伺服器上的暫存檔案名。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<form action="http://localhost:8080/test/test2.php" method = "POST" enctype="multipart/form-data">
<label>password</label>
<input type="text" name="pw">
<br>
<input type="file" name="rawfile">
<button>Login</button>
</form>
</body>
</html>
設定 enctype 屬性為 multipart/form-data 將資料透過POST方法傳遞到test2.php。
<?php//假設上傳Claude assistant.txt
echo $_FILES['rawfile']['name'];//檔案原始名稱
echo $_FILES['rawfile']['size'];//檔案大小
echo $_FILES['rawfile']['tmp_name'];//伺服器上暫存檔案名
echo $_FILES['rawfile']['type'];//檔案類型
echo $_FILES['rawfile']['error'];//錯誤代碼
?>
$_ENV
用來存取環境變數。
<?php
echo getenv('USERNAME');
?>
除了用getenv()函式搭配鍵值取得環境變數外,也可以透過php.ini設定variables_order="EGPCS" (E:Environment、G:GET、P:POST、C:Cookie,S:Server),藉由 print_r 函式取得所有環境變數,環境變數詳細內容可自行嘗試,礙於篇幅不一一做演示。
<?php
print_r($_ENV);
?>
$_COOKIE
Cookie全名為 HTTP COOKIE,是一種由網站傳送至用戶瀏覽器的小型資料,用於記錄用戶的瀏覽活動和偏好設定,像是登入資料與購物車等等,讓你在瀏覽網頁時能更流暢、方便,有更好的用戶體驗。
了解完Cookie的概念後,$_COOKIE這個超全域變數用於儲存Cookie資料,是一個關聯陣列。
<?php
setcookie("password", $_REQUEST["pw"],time()+360);
echo $_COOKIE['password'];
?>
$_SESSION
Session則是與Cookie相反,存在伺服器端,用於儲存Session資料,是一個關聯陣列。
<?php
session_start();//啟動頁面的 session 功能
setcookie("password", $_REQUEST["pw"],time()+360);
echo $_COOKIE['password'];
$_SESSION['password'] = $_REQUEST['pw'];//新增一筆資料
echo $_SESSION['password'];
?>
本篇文章到這裡就結束了,探索PHP的旅程還沒有結束,接下來會繼續前往新大陸:邏輯控制與運算子,如果喜歡我的文章或覺得有用的話,歡迎動動手指點擊愛心,你/妳的支持是我最大的動力,我們下篇文章見🙌。

