【发布时间】:2011-06-07 18:39:50
【问题描述】:
在 PHP 中,我希望能够全局访问 PUT 和 DELETE 变量,类似于全局访问 GET 和 POST 变量的方式。我最初考虑将数据分别添加到全局命名空间中的$_PUT 和$_DELETE,但后来我意识到每个请求的数据都存储在消息正文中,因此无法从一个POST、PUT 或 DELETE 请求。
覆盖$_POST 变量是否有任何副作用?
即str_parse( file_get_contents( 'php://input' ), $_POST );
我是不是很傻,还是有更好的方法来访问 PUT 和 DELETE 数据?
编辑以澄清我的想法:
我非常清楚$_POST 中的数据来源,实际上我在前面的问题中提到过。如果向服务器发送 HTTP POST 请求,则数据存储在 php://input 中。如果向服务器发送 HTTP PUT 或 DELETE 请求,则数据将存储在完全相同的位置,这意味着 $_POST 将为空(因为尽管数据可用,但没有数据是 POSTed。
另一方面,GET 请求是通过查询字符串传递的。这允许同时传递$_POST 和$_GET 变量。 不可能同时传递POST 和PUT or DELETE 变量。
如果我在PUT 和/或DELETE 请求上从php://input 覆盖$_POST,则不会丢失数据。
添加的替代方法:
global $_PUT;
global $_DELETE;
函数的开头似乎很愚蠢,因为我一次只能使用一个无论如何。
我真正想要回答的第一个问题是关于覆盖$_POST 时存在哪些副作用或问题。我不可能是第一个尝试这样愚蠢的事情的人:
$_POST['foo'] = 'bar';
我只是担心如果我做任何类似的事情,它可能不会跨范围保留。
【问题讨论】:
-
我有车。在窗户上贴一些塑料不会把它变成一条船。用来自其他 HTTP 方法的数据覆盖超全局变量只会导致长期的痛苦,特别是如果您计划将此代码模块化和/或与其他人共享它。 $_POST 用于 POST 数据,$_GET 用于 GET 数据。不要把它们混在一起。
-
@Marc B,好的,但是如果我用一个充当
$_POST数据包装器的对象覆盖$_POST,实现数组接口(ArrayAccess、Countable 等)怎么办?无需修改开发人员与$_POST超全局交互的方式即可提供附加功能。 -
那很好,因为它只是重新创建那里的任何东西。但是将 POST 颠覆为真正的 HEAD 会破坏系统中的所有其他内容。
-
你可以修改
_POST或_GET不用太担心PHP本身,只是一个变量。其他人主要担心的是,您以后可能不知道您的POST或GET数据被“神奇地”修改了。我过去修改了_POST,当时我无法修改一些不依赖参数但超全局的方法 -
如果他们将请求正文称为 $_BODY 而不是 $_POST,答案将是显而易见的......