我在手冊中的其他地方找不到它,所以我會在這裡做個記錄 - PHP 會自動將傳入變數名稱中的任何點 ('.') 替換為底線 ('_')。因此,如果您的傳入變數中有點,例如:
example.com/page.php?chuck.norris=nevercries
您不能使用 URI 中使用的名稱來參考它們
//錯誤
echo $_GET['chuck.norris'];
而是必須使用
//正確
echo $_GET['chuck_norris'];
PHP 提供了一些預定義變數。PHP 也提供了一組額外的預定義陣列,其中包含來自網路伺服器(如果適用)、環境和使用者輸入的變數。這些陣列在每個範圍內自動可用。因此,它們通常被稱為「超全域變數」。(PHP 中沒有使用者自訂超全域變數的機制。)有關詳細資訊,請參閱超全域變數列表。
注意:可變變數
超級全域變數不能在函式或類別方法中作為可變變數使用。
如果 variables_order 中的某些變數未設定,則其對應的 PHP 預定義陣列也會保留為空。
我在手冊中的其他地方找不到它,所以我會在這裡做個記錄 - PHP 會自動將傳入變數名稱中的任何點 ('.') 替換為底線 ('_')。因此,如果您的傳入變數中有點,例如:
example.com/page.php?chuck.norris=nevercries
您不能使用 URI 中使用的名稱來參考它們
//錯誤
echo $_GET['chuck.norris'];
而是必須使用
//正確
echo $_GET['chuck_norris'];
我的主要檔案中有這個函式,它允許某些頁面更容易進行 SEO,而不必依賴 .htaccess 和 mod_rewrite 來處理某些事情。
<?php
function long_to_GET(){
/**
* 這個函式將 info.php/a/1/b/2/c?d=4 轉換為
* Array ( [d] => 4 [a] => 1 [b] => 2 [c] => )
**/
if(isset($_SERVER['PATH_INFO']) && $_SERVER['PATH_INFO'] != ''){
//將其拆分。
$tmp = explode('/',$_SERVER['PATH_INFO']);
//移除第一個空項目
unset($tmp[0]);
//迴圈並將其附加到 $_GET 超級全域變數中。
for($i=1;$i<=count($tmp);$i+=2){ $_GET[$tmp[$i]] = $tmp[$i+1];}
}
}
?>
它可能不是最有效率的,但它可以很好地完成工作。
DD32
- 安全性問題和解決方法 -
如果您使用「eval()」來執行儲存在資料庫或其他地方的程式碼,您可能會發現這個技巧很有用。
問題
根據預設,所有超級全域變數在每個函式中都是已知的。
因此,如果您評估資料庫或動態產生的程式碼(我們稱之為「潛在不安全程式碼」),它可以使用儲存在_任何_超級全域變數中的_所有_值。
解決方法
每當您想要隱藏超級全域變數以避免在評估的程式碼中使用時,請將該 eval() 包裝在您自己的函式中,在該函式中您可以 unset() 所有超級全域變數。PHP 不會在所有作用域中刪除超級全域變數 - 僅在該函式中刪除。例如:
function safeEval($evalcode) {
unset($GLOBALS);
unset($_ENV);
// 清除任何其他超全域變數...
return eval($evalcode);
}
(此範例假設 eval 會使用 'return' 回傳值)
此外,透過在類別外部的全局範圍定義這樣的函式,您也可以確保被評估的(不安全)程式碼無法存取物件變數 ($this-> ...)。
當您想要匯出一個變數時,您可以使用 return $varible、return an array() 或將其設為全域變數。如果您使用 return 回傳值,則在腳本執行時,該變數的資訊只能單向傳遞,也就是傳出函式。
function fn() {
$varible = "something";
return $variable;
}
echo fn();
或者
$newvariable = fn();
然而,如果使用 global,它會建立一個指向變數的指標,無論該變數是否存在,並將函式中建立的任何內容連結到該全域指標。因此,如果指標是 global $varible,然後您設定 $varible 的值,那麼它就可以在全域範圍內存取。但是,如果您稍後在腳本中重新定義該全域變數,使其等於其他值,那會發生什麼事?這表示無論將什麼放入全域陣列中,在指標中設定的資訊都可以在任何時候被設定(覆寫)。以下是一個可能使這一點更清楚的範例
function fn1() {
global $varible; // 指向全域陣列的指標
$varible = "something";
}
fn1();
echo $varible; // 顯示 something
$varible = "12345";
echo $varible; // 顯示 12345
function fn2() {
global $varible; // 指向全域陣列的指標
echo $varible;
}
fn2(); // 顯示 $varible,其值為 "12345"
基本上,當存取全域陣列時,您可以將其設定為參考已定義的內容,或將其設定為某個值(一個指標),例如您打算在函式中建立的變數,然後可能用其他值覆寫該指標。