预定义变量

PHP 为其运行的任何脚本提供大量预定义变量。但是,许多这些变量无法完全记录,因为它们取决于运行的服务器、服务器的版本和设置以及其他因素。当 PHP 在 命令行 上运行时,某些变量将不可用。有关详细信息,请参阅 预定义变量列表

PHP 还提供了一组额外的预定义数组,其中包含来自 Web 服务器(如果适用)、环境和用户输入的变量。这些数组非常特殊,因为它们是自动全局的,即它们在每个范围内自动可用。因此,它们通常被称为“超级全局变量”。(PHP 中没有机制用于用户定义的超级全局变量。)有关详细信息,请参阅 超级全局变量列表

注意: 可变变量

超级全局变量不能在函数或类方法内用作 可变变量

如果 variables_order 中的某些变量未设置,则其相应的 PHP 预定义数组也将保持为空。

添加注释

用户贡献注释 4 个注释

johnphayes at gmail dot com
18 年前
我在手册的任何其他地方都没有找到它,因此我会在这里做个笔记 - PHP 会自动将传入变量名中的任何点 ('.') 替换为下划线 ('_')。因此,如果您在传入变量中包含点,例如

example.com/page.php?chuck.norris=nevercries

您不能使用 URI 中使用的名称来引用它们
// 不正确
echo $_GET['chuck.norris'];

相反,您必须使用
// 正确
echo $_GET['chuck_norris'];
DD32=theonly_DD32[&]yahoo.com.au
18 年前
我的主文件中包含此函数,它允许更轻松地进行 SEO,而无需依赖 .htaccess 和 mod_rewrite 来完成某些事情。
<?php
function long_to_GET(){
/**
* 此函数将 info.php/a/1/b/2/c?d=4 转换为
* 数组 ( [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
lopez dot on dot the dot lists at yellowspace dot net
21 年前
- 安全问题和解决方法 -
如果您使用“eval()”来执行存储在数据库或其他地方的代码,您可能会发现这个技巧很有用。

问题
默认情况下,所有超级全局变量在每个函数中都是已知的。
因此,如果您评估数据库或动态生成的代码(我们称之为“潜在不安全的代码”),它可以使用 _所有_ 存储在 _任何_ 超级全局变量中的值。

解决方法
每当您想从评估的代码中隐藏超级全局变量时,请将该 eval() 包装在一个您在其中 unset() 所有超级全局变量的函数中。超级全局变量不会在所有范围内被 php 删除,而只是在该函数内。例如

function safeEval($evalcode) {
unset($GLOBALS);
unset($_ENV);
// unset 任何其他超级全局变量...
return eval($evalcode);
}

(此示例假设 eval 返回带有“return”的内容)

此外,通过在全局范围内(在类之外)定义此类函数,您还可以确保评估的(“不安全的”)代码无法访问对象变量($this->...)。
LouisGreen at pljg dot freeserve dot co dot uk
21 年前
似乎当您想导出变量时,您可以使用 return $varible、返回数组() 或将其全局化。如果您返回某些内容,则在脚本运行时,该变量的信息只能单向传递,即从函数中传递出来。

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”

基本上,当访问全局数组时,您可以设置它指向已定义的内容,或者将其设置为某件事(指针),例如您计划在函数中创建的变量,并可能稍后用其他内容覆盖指针。
To Top