PHP Conference Japan 2024

预定义变量

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

注意可变变量

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

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

添加注释

用户贡献的注释 4 条注释

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

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

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

而是必须使用
//正确的
echo $_GET['chuck_norris'];
6
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 转换为
* 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
8
lopez dot on dot the dot lists at yellowspace dot net
21 年前
- 安全问题和解决方法 -
如果您使用“eval()”来执行存储在数据库或其他地方的代码,您可能会发现此提示很有用。

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

解决方法
每当您想隐藏超全局变量在已评估代码中的使用时,请将该 eval() 包装在您自己的函数中,在该函数中您可以 unset() 所有超全局变量。超全局变量不会在所有作用域中被 php 删除 - 只在该函数内。

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

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

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

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(); // 显示包含“12345”的 $varible

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