PHP中许多预定义变量都是“超全局的”,这意味着它们在一个脚本的全部作用域中都可用。超全局变量除了具有全局变量特点外,在函数或方法中无需执行global $variable;就可以访问它们。
提供超全局数组的原因是为了让程序员更方便快捷的写出PHP程序。
PHP提供了九种超全局变量是:$GLOBALS,$_SERVER,$_GET,$_POST,$_FILES,$_COOKIE,$_SESSION,$_REQUEST,$_ENV。
1,$_GET:通过URL参数传递给当前脚本的变量的数组,apache的php模块将$_GET传递参数封装到$_GET数组中传递给相应的php页面。
(1)$_GET实际使用情况:
① 客户机(浏览器)通过超链接传递信息给服务器;
a1.php
echo "<a href='a2.php?city=北京号&name=xiaoming'>传送数据</a>";
a2.php
var_dump($_GET);
浏览器传输中文字符时候,会出现乱码,解决方法:
(a) 发送端的奇数中文加一个全角空格,然后到服务器接收,去掉两头的空行trim();
(b) 发送端的中文使用urlencode编码,服务器端使用urldecode解码;现在PHP会自动解码,但是在编程时候最好加上urldecode解码。
a1.php
$str = urlencode('北京号码'); echo "<a href='a2.php?city=".$str."&name=xiaoming'>传送数据</a>";
a2.php
var_dump(urldecode($_GET['city']));
② 客户机(浏览器)通过表单传递信息给服务器;推荐使用$_POST方式传递表单参数。
(2)判断$_GET参数是否为空,推荐使用empty判断,也可以使用isset()。
(3)$_GET使用陷阱,在php.ini中register_globals = off,如果修改为on,则有注入的风险。
b.php
echo $name."---".$age;
使用超链接访问b.php时候,在地址栏输入http://localhost/b.php?name=ada&age=12 ,b.php页面由于错误,无法正常显示,如果把register_globals开启,那么b.php页面则会正常显示,这样存在很大风险,所以不能开始register_globals。
2,$_POST,apache的php模块将$_POST传递参数封装到$_POST数组中传递给相应的php页面。$_POST在传递中文时候,自动为你编码,在服务器端在自动解码,因此不会出现乱码情况。
3,$_REQUEST
定义:$_REQUEST中的变量通过GET、POST和COOKIE输入机制传递给脚本文件,$_REQUEST可以包括$_GET/$_POST/$_COOKIE数组,范围更大了。$_REQUEST可以被远程用户篡改而并不可信,因此这个不建议使用。之前当我们不知道数据是以那种方式传递过来数据时候,可以用$_REQUEST,现在这种情况下也可以不用$_REQUEST,比如如下代码:
if($_SERVER['REQUEST_METHOD'] == 'POST'){ echo $_POST['名字']; }else if($_SERVER['REQUEST_METHOD'] == 'GET'){ echo $_GET['名字']; }else if($_SERVER['REQUEST_METHOD'] == 'COOKIE'){ echo $_COOKIE['名字']; }
4,$_SERVER
$_SERVER中主要包含了http请求行和消息头的信息,同时还有服务器自己的一些信息,比如DOCUMENT_ROOT,SCRIPT_FILENAME。
5,$_ENV
$_ENV在新版本PHP已经禁用,如果开启,需要修改php.ini的variables_order=”EGPCS”,但是在开发环境下不建议启用。
6,$_FILE与文件上传相关,$_COOKIE与COOKIE相关,$_SESSION与SESSION相关。
7,$GLOBALS
引用全局作用域中可用的全部变量,包含了全部变量的全局组合数组。变量的名字就是数组的键,同时一个自定义的全局变量,也会自动的被$GLOBALS管理。示例如下:
function test(){ $foo = "local variable"; echo '$foo in global scope:'.$GLOBALS["foo"]." "; echo '$foo in current scope:'.$foo." "; } $foo = "Example content"; test();
输出如下:
$foo in global scope: Example content $foo in current scope: local variable
浏览器传输中文字符时候,会出现乱码,解决方法:
(a) 发送端的奇数中文加一个全角空格,然后到服务器接收,去掉两头的空行trim();
(b) 发送端的中文使用urlencode编码,服务器端使用urldecode解码;现在PHP会自动解码,但是在编程时候最好加上urldecode解码。