在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变量.
如果我$_POST从php://inputon PUT和/或DELETE请求中覆盖,则不会丢失数据.
添加的替代方法:
global $_PUT;
global $_DELETE;
Run Code Online (Sandbox Code Playgroud)
到函数的开始似乎傻了,因为我只可以使用一次一个反正.
我的第一个问题,即我真正想要回答的问题,是关于覆盖中存在的副作用或问题$_POST.我不可能成为第一个尝试傻事的人:
$_POST['foo'] = 'bar';
Run Code Online (Sandbox Code Playgroud)
我只关心如果我做了类似的事情,它可能不会在范围内保留.
Chr*_*ker 15
你会在整个互联网上看到这个被称为"坏习惯"的东西,但是如果你真的明白为什么它是"坏习惯",那么答案就会变得模糊.最具体的原因是"被公共汽车撞击"的场景经常被大肆渲染 - 如果项目交给新的开发人员怎么办?
手捶胸顿足一边(你可以发表评论,毕竟),是不是真的有一个令人信服的理由不去做这样的,但同样,没有一个令人信服的理由来做到这一点,无论是.$_SESSION如果要将值全局化,为什么不将值放在键中?或者制作一个全局变量?或者创建一个静态类来访问PUT/DELETE值?使用所有其他可选方法,我认为覆盖$_POST虽然不会使您的服务器爆炸,但最有可能让您头疼.
我把这个小静态类放在一起,你需要在依赖它之前测试它.使用:
//To check if this is a rest request:
Rest::isRest();
//To get a parameter from PUT
$put_var = Rest::put('keyname', false);
//To get a parameter from DELETE
$dele_var = Rest::delete('keyname', false);
class Rest {
static private $put = false;
static private $delete = false;
static private $is_rest = false;
function __construct() {
self::$is_rest = true;
switch ($_SERVER['REQUEST_METHOD']) {
case 'PUT':
parse_str(self::getVars(), self::$put);
break;
case 'DELETE':
parse_str(self::getVars(), self::$delete);
break;
default:
self::$is_rest = false;
}
}
private static function getVars() {
if (strlen(trim($vars = file_get_contents('php://input'))) === 0)
$vars = false;
return $vars;
}
public static function delete($key=false, $default=false) {
if (self::$is_rest !== true)
return $default;
if (is_array(self::$delete) && array_key_exists($key, self::$delete))
return self::$delete[$key];
return $default;
}
public static function put($key=false, $default=false) {
if (self::$is_rest !== true)
return $default;
if (is_array(self::$put) && array_key_exists($key, self::$put))
return self::$put[$key];
return $default;
}
public static function isRest() {
return self::$is_rest;
}
}
Run Code Online (Sandbox Code Playgroud)