網頁設計 EP04-PHP變數範圍

更新 發佈閱讀 13 分鐘

上一篇了解到PHP的基本語法與變數,事不宜遲,接下來就要更深入了解變數的變數範圍。

網頁設計 EP03-PHP基本語法與變數

變數範圍(scope)

變數的範圍會影響在程式的可見性與週期。

分為全域變數、區域變數以及在其他語言比較少被提及的靜態變數。

raw-image

全域變數(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"];
?>

可以看到網址的尾巴並沒有剛剛傳遞過來的參數。

raw-image

$_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"];
?>

可以看到網址的尾巴有剛剛傳遞過來的參數。

raw-image

$_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的旅程還沒有結束,接下來會繼續前往新大陸:邏輯控制與運算子,如果喜歡我的文章或覺得有用的話,歡迎動動手指點擊愛心,你/妳的支持是我最大的動力,我們下篇文章見🙌。

留言
avatar-img
逃的沙龍
0會員
7內容數
分享學習路上的內容與心得
逃的沙龍的其他內容
2026/02/13
本篇文章將帶你快速瞭解 PHP 的基本語法,包含標籤、分號、列印 (echo)、註解、變數宣告、命名規則、常見資料型別 (字串、整數、浮點數、布林值、null) 以及型別轉換 (casting) 的應用。適合剛接觸 PHP 的初學者,為後續的程式撰寫奠定基礎。
Thumbnail
2026/02/13
本篇文章將帶你快速瞭解 PHP 的基本語法,包含標籤、分號、列印 (echo)、註解、變數宣告、命名規則、常見資料型別 (字串、整數、浮點數、布林值、null) 以及型別轉換 (casting) 的應用。適合剛接觸 PHP 的初學者,為後續的程式撰寫奠定基礎。
Thumbnail
2026/02/11
本篇文章將教學如何將 Visual Studio Code (VS Code) 與 XAMPP 伺服器環境結合,設定 VS Code 以便能順暢執行 PHP 程式。內容涵蓋 VS Code 插件安裝、連接埠 (Port) 設定、DocumentRoot 設定,以及實際執行你的第一個 PHP 程式。
Thumbnail
2026/02/11
本篇文章將教學如何將 Visual Studio Code (VS Code) 與 XAMPP 伺服器環境結合,設定 VS Code 以便能順暢執行 PHP 程式。內容涵蓋 VS Code 插件安裝、連接埠 (Port) 設定、DocumentRoot 設定,以及實際執行你的第一個 PHP 程式。
Thumbnail
2026/02/10
XAMPP 是一款完全免費且開源的跨平台 Web 伺服器軟體解決方案套件。它的名字是一個縮寫,代表了其核心組成部分: X (Cross-platform): 跨平台,支援 Windows、Linux 和 macOS。 A (Apache): 全球使用最廣泛的 Web 伺服器軟體。 M (Mar
Thumbnail
2026/02/10
XAMPP 是一款完全免費且開源的跨平台 Web 伺服器軟體解決方案套件。它的名字是一個縮寫,代表了其核心組成部分: X (Cross-platform): 跨平台,支援 Windows、Linux 和 macOS。 A (Apache): 全球使用最廣泛的 Web 伺服器軟體。 M (Mar
Thumbnail
看更多