首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 變數變數技巧:簡潔匯入 $_POST/$_GET/$_COOKIE 到區域變數

     編輯:PHP 綜合知識

核心原理:變數變數 (Variable Variables)

<?php
$var_a = 'var_b';
$$var_a = 'test'; // 等同於 $var_b = 'test';
echo $var_b; // 輸出 test

一鍵匯入超全域陣列

<?php
foreach (['_COOKIE', '_POST', '_GET'] as $_request) {
    foreach ($$_request as $_key => $_value) {
        // 略過以 _ 開頭的鍵(防止覆蓋系統變數)
        if ($_key[0] !== '_') {
            $$_key = addslashes($_value); // 簡單過濾
        }
    }
}

// 現在可以直接使用 $name, $pwd 等變數
// 對應網址:test.php?name=John&pwd=secret
echo $name; // John
echo $pwd;  // secret

安全性風險分析

風險說明緩解
變數覆蓋惡意傳入 _SESSION[admin]=1 覆蓋權限判斷略過 _ 開頭鍵、白名單機制
SQL Injectionaddslashes() 不足以防禦所有注入改用 Prepared Statement
XSS直接輸出未跳脫變數輸出時 htmlspecialchars()
命名空間汙染大量變數汙染區域作用域封裝在函式/類別中

現代最佳實務:顯式存取與過濾

<?php
// 輸入過濾器類別
class Input {
    public static function get($key, $default = null, $filter = FILTER_SANITIZE_STRING) {
        return filter_input(INPUT_GET, $key, $filter) ?? $default;
    }
    public static function post($key, $default = null, $filter = FILTER_SANITIZE_STRING) {
        return filter_input(INPUT_POST, $key, $filter) ?? $default;
    }
    public static function request($key, $default = null) {
        return $_REQUEST[$key] ?? $default; // 不建議常用
    }
}

// 使用
$name = Input::get('name', '', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$age  = Input::post('age', 0, FILTER_VALIDATE_INT);
$email = Input::post('email', '', FILTER_VALIDATE_EMAIL);

框架中的對應實作

  • Laravel:$request->input('name'), $request->validated()
  • Symfony:$request->get('name'), 表單元件自動綁定驗證
  • Yii2:Yii::$app->request->get('name'), 模型 load() + validate()
  • Slim/PSR-7:$request->getParsedBody()['name']

結論

變數變數技巧雖簡潔,但不建議在現代專案使用。顯式存取、輸入驗證、型別轉換才是可維護、安全的寫法。僅適用於快速原型、舊代碼維護或深度理解 PHP 變數機制的教學場合。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved