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
全局变量的数据来源有三个,分别是:$_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
文件:
使用wisdom restClient
进行测试,

输出:

相关文章
- 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
经验文章,请点击苏南大叔的博客文章:


