PHP强化之04 - 超全局数组(新)

2022-01-12  本文已影响0人  四月不见

----- 最近更新【2022-01-12】-----

PHP强化系列--目录

一、简介

定义:超全局变量是在全部作用域中始终可用的内置变量。PHP 中的许多预定义变量都是“超全局的”,这意味着它们在一个脚本的全部作用域中都可用。在函数或方法中无需执行global $variable,就可以访问它们。

在PHP中超全局变量一共有9种,它们分别是:$GLOBALS$_SERVER$_GET$_POST$_FILES$_COOKIE$_SESSION$_REQUEST$_ENV

二、超全局变量

1、$GLOBALS

一个包含了全部变量的全局组合数组。变量的名字就是数组的键。

使用var_dump($GLOBALS)打印,就可以看出$GLOBALS是一个包含了所有的一个全局组合数组。

array (size=9)
  '_GET' => 
    array (size=1)
      'aa' => string '12345' (length=5)
  '_POST' => 
    array (size=0)
      empty
  '_COOKIE' => 
    array (size=1)
      'PHPSESSID' => string 'dscqcql91ap682d83oi80c3aj6' (length=26)
  '_FILES' => 
    array (size=0)
      empty
  '_SESSION' => 
    array (size=0)
      empty
  '_ENV' => 
    array (size=0)
      empty
  '_REQUEST' => 
    array (size=1)
      'aa' => string '12345' (length=5)
  '_SERVER' => 
    array (size=32)
      'HTTP_HOST' => string '47. ... .116' (length=14)
      'HTTP_CONNECTION' => string 'keep-alive' (length=10)
      ... ...
      'REQUEST_TIME_FLOAT' => float 1544101407.738
      'REQUEST_TIME' => int 1544101407
  'GLOBALS' => 
    &array<

例:

function test() {
    $foo = "local variable";
    echo '$foo       : ' . $GLOBALS["foo"] . "\n";
    echo '$foo       : ' . $foo . "\n";
}
$foo = "Example content";
test();
//运行结果:
$foo 在全局作用域: Example content
$foo 在当前作用域: local variable

警告: 从 PHP 8.1.0 起,不再支持对整个 $GLOBALS 数组的写访问

从 PHP 8.1.0 起,$GLOBALS 现在是全局符号表的只读副本。 也就是说,全局变量不能通过副本进行修改。 在之前的版本中,$GLOBALS 数组和 PHP 数组通常传值的行为不一样,全局变量可通过副本修改。

PHP 8.1.0 之前:

$a = 1;
$globals = $GLOBALS; // 表面意义的按值复制
$globals['a'] = 2;   // $GLOBALS['a'] 的值也相应修改
var_dump($a);
//运行结果:
int(2)

从 PHP 8.1.0 起:

$a = 1;
$globals = $GLOBALS;    //表面意义的按值复制
$globals['a'] = 2;    // $GLOBALS['a'] 的值不会改变(不再修改 $a)
var_dump($a);
//运行结果:
int(1)

要恢复以前的行为,请迭代其副本并将每个属性分配回 $GLOBALS

foreach ($globals as $key => $value) {
    $GLOBALS[$key] = $value;
}

2、$_SERVER

$_SERVER——服务器和执行环境信息。$_SERVER是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组。这个数组中的项目由 Web 服务器创建。

$_SERVER包含的信息比较多,这里就几个常见的拿出来讲解一下:

更多的参数请查看:http://php.net/manual/zh/reserved.variables.server.php

3、$_GET

通过 URL 参数传递给当前脚本的变量的数组。注意:该数组不仅仅对 method 为 GET 的请求生效,而是会针对所有带 query string 的请求。

4、$_POST

预定义的 $_POST 变量用于收集来自 method="post" 的表单中的值。

当 HTTP POST 请求的 Content-Type 是 application/x-www-form-urlencodedmultipart/form-data 时,会将变量以关联数组形式传入当前脚本。

从带有 POST 方法的表单发送的信息,对任何人都是不可见的(不会显示在浏览器的地址栏),并且对发送信息的量也没有限制。
注释:然而,默认情况下,POST 方法的发送信息的量最大值为 8 MB(可通过设置 php.ini 文件中的 post_max_size 进行更改)。

5、$_FILES

通过 HTTP POST 方式上传到当前脚本的项目的数组。

$_FILES是一个二维数组,其内容主要有以下五项:

1)$_FILES["userfile"]["error"]
error总共有5个不同的返回值,其中0表示成功,另外4个表示在尝试中出现错误。

2)$_FILES["userfile"]["name"]
name表示客户端机器上声明的文件最初的名字,包括扩展名。因此,如果浏览器一个名为test.png的文件,并通过表单上传,则此变量的值将是test.png。

3)$_FILES["userfile"]["size"]
size指定从客户端上传的文件的大小,以字节为单位。因此,在test.png文件的例子中,此函数可能赋值为5253,大约为5kb.

4)$_FILES["userfile"]["tmp_name"]
tmp_name指定上传到服务器后为文件赋予的临时名。这是存储在临时目录(由PHP指令upload_tmp_dir指定)中时所指定的文件名。

5)$_FILES["userfile"]["type"]
type指定从客户端上传的文件的mime类型。因此,在test.png文件的例子中,此变量会赋值为image/png。如果上传的是PDF,则赋值为application/pdf。因为这个变量有时会得到意外的结果,所以应当在脚本中显示地进行验证。

6、$_COOKIE

通过 HTTP Cookies 方式传递给当前脚本的变量的数组。

7、$_SESSION

当前脚本可用 SESSION 变量的数组。

8、$_REQUEST

默认情况下包含了 $_GET$_POST$_COOKIE 的数组。由于安全的问题,建议尽量避免使用$_REQUEST

9、$_ENV

通过环境方式传递给当前脚本的变量的数组。

这些变量被从 PHP 解析器的运行环境导入到 PHP 的全局命名空间。很多是由支持 PHP 运行的 Shell 提供的,并且不同的系统很可能运行着不同种类的 Shell,所以不可能有一份确定的列表。请查看你的 Shell 文档来获取定义的环境变量列表。

其他环境变量包含了 CGI 变量,而不管 PHP 是以服务器模块还是 CGI 处理器的方式运行。

三、经典案例

1、用php写出显示客户端ip与服务器ip的代码

$_SERVER["REMOTE_ADDR"]
$_SERVER["SERVER_ADDR"]

2、获取当前页面的完整URL

echo 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
//Or:
echo 'http://'.$_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
//Or
echo 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'];

//若不确定是http还是https,还可以写成如下形式:
echo $_SERVER['REQUEST_SCHEME']."//".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];

四、参考

官方手册:http://www.php.net/manual/zh/language.variables.superglobals.php

上一篇 下一篇

猜你喜欢

热点阅读