PHP中预定义超全局数组(变量)

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"]."\n";
    echo '$foo in current scope:'.$foo."\n";
}
$foo = "Example content";
test();

输出如下:

$foo in global scope: Example content
$foo in current scope: local variable

 浏览器传输中文字符时候,会出现乱码,解决方法:

(a) 发送端的奇数中文加一个全角空格,然后到服务器接收,去掉两头的空行trim()
(b) 发送端的中文使用urlencode编码,服务器端使用urldecode解码;现在PHP会自动解码,但是在编程时候最好加上urldecode解码。
posted on 2015-10-28 17:21  张三的哥哥  阅读(659)  评论(0编辑  收藏  举报