php全局变量$_REQUEST,数据来源哪里?有什么潜规则?
发布于 作者:苏南大叔 来源:程序如此灵动~本文对php
的$_REQUEST
全局变量进行一下简单的分析。当然,本文依然是一篇颠覆三观的文章,刷新大家对$_REQUEST
的认知。在各种高级语言编程里面,request
都是在做http
编程的时候的首要交互变量。然而,在php
编程语言里面,这个$_REQUEST
却是不被推荐使用的。这究竟是为什么呢?
苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码感想和感悟。本文测试环境:win10
,nginx@1.15.11
,php@8.2.10-nts
。
$_REQUEST组成
$_REQUEST
实际上是由$_GET
、$_POST
、以及$_COOKIE
三者合并而成的。所以,更推荐使用的是后面这三个变量:$_GET
、$_POST
、以及$_COOKIE
。因为它们具有更加明确的指代性。
如果使用$_REQUEST
全局变量的话,就必须知晓它的几条潜规则,才能更好的调试和使用$_REQUEST
相关的php
代码。
request_order合并顺序
在php.ini
里面是这样写的:
; request_order
; Default Value: None
; Development Value: "GP"
; Production Value: "GP"
; This directive determines which super global data (G,P & C) should be
; registered into the super global array REQUEST. If so, it also determines
; the order in which that data is registered. The values for this directive
; are specified in the same manner as the variables_order directive,
; EXCEPT one. Leaving this value empty will cause PHP to use the value set
; in the variables_order directive. It does not mean it will leave the super
; globals array REQUEST empty.
; Default Value: None
; Development Value: "GP"
; Production Value: "GP"
; https://php.net/request-order
request_order = "GP"
苏南大叔的理解就是:$_REQUEST
全局变量的数据来源有三个,分别是:$_GET
、$_POST
、以及$_COOKIE
。然而,php
官方并不相信$_COOKIE
值,默认情况下,并不会开启对$_COOKIE
变量的合并,而仅仅处理$_GET
、$_POST
。
request_order
的内存里面的默认值是None
,但是实际上默认写在php.ini
里面的值是GP
。
潜规则一,GPC相互覆盖
如果被合并的三个变量之间有同名成员组成的话,就会产生谁覆盖谁的问题。于是就有了php.ini
里面的这个request_order
设置。默认写在php.ini
里面的设置为GP
,意思就是$_POST
覆盖$_GET
里面的数据,$_COOKIE
不参与数据覆盖。
这个GP
设定就比较合理,并不建议修改。当post
和get
同时传输数据的时候,优先解析post
里面的数据。
潜规则二,variables_order替代控制
在php.ini
里面,如果没有设置request_order
项目的话,内存中就会使用默认者None
。这个时候,variables_order
就会替代request_order
,起到同样的作用。如果variables_order
也不设置或者设置为空的话,默认值是EGPCS
,最终效果是GPC
。
虽然variables_order
的设置中,多个E
和S
,但是也确实存在GPC
的字样和顺序。既然request_order
取值None
的话,这里variables_order
就越俎代庖,强制设置$_REQUEST
变量的数据来源的覆盖顺序。
特别需要注意的是:这种特殊情况下,C
也就是$_COOKIE
偷偷参与了$_REQUEST
变量的数据覆盖。那么,对于variables_order
的默认值EGPCS
来说,$_REQUEST
变量的数据来源,$_COOKIE
的优先级反而变得最高。
测试代码
php
文件:
echo "variables_order:\r\n";
var_dump(ini_get("variables_order"));
echo "request_order:\r\n";
var_dump(ini_get("request_order"));
echo "\r\n".'$_REQUEST:'."\r\n";
var_dump($_REQUEST);
echo "\r\n".'$_POST:'."\r\n";
var_dump($_POST);
echo "\r\n".'$_GET:'."\r\n";
var_dump($_GET);
echo "\r\n".'$_COOKIE:'."\r\n";
var_dump($_COOKIE);
使用wisdom restClient
进行测试,
输出:
variables_order:
string(4) "GPCS"
request_order:
string(2) "GP"
$_REQUEST:
array(1) {
["a"]=>
string(4) "post"
}
$_POST:
array(1) {
["a"]=>
string(4) "post"
}
$_GET:
array(1) {
["a"]=>
string(3) "get"
}
$_COOKIE:
array(1) {
["a"]=>
string(6) "cookie"
}
相关文章
- https://newsn.net/say/restclient-wisdom.html
- https://newsn.net/say/restclient-wiztools.html
- https://newsn.net/say/php-sapi-server.html
结束语
本文所描述的这种情况很少见,毕竟很少有人会改动php.ini
。只要注意尽量使用$_GET
、$_POST
、以及$_COOKIE
自身,而不使用一个笼统的$_REQUEST
变量即可。
更多php
经验文章,请点击苏南大叔的博客文章:
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。