为PUT或DELETE请求覆盖$ _POST

zzz*_*Bov 14 php rest

在PHP中,我想能够访问PUTDELETE瓦尔全局相似如何GETPOST增值经销商在全球范围内访问.我原本认为加入数据$_PUT$_DELETE分别在全局命名空间,但后来我意识到,每个请求的数据存储在邮件正文中,所以没有办法为了有更多比从一个数据集POST,PUTDELETE请求.

是否有覆盖$_POST变量的副作用?

str_parse( file_get_contents( 'php://input' ), $_POST );

我是愚蠢的,还是有更好的方式来访问PUTDELETE数据?


编辑以澄清我的想法:

我非常清楚数据的来源$_POST,实际上我在前面的问题中提到过.如果向服务器发送HTTP POST请求,则存储数据php://input.如果向服务器发送HTTP PUT或DELETE请求,则数据将存储在完全相同的位置,这意味着$_POST它将为空(因为POSTed尽管数据可用,但没有数据.

GET请求,在另一方面,通过查询字符串中传递.这允许同时传递$_POST$_GET变量.这是不是可以同时通过POSTPUT or DELETE变量.

如果我$_POSTphp://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)