Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在HTTP请求类中实现不同的请求方法_Php_Oop_Http_Httprequest - Fatal编程技术网

Php 在HTTP请求类中实现不同的请求方法

Php 在HTTP请求类中实现不同的请求方法,php,oop,http,httprequest,Php,Oop,Http,Httprequest,我目前正在编写自己的HTTP请求类,遇到了一个小问题。您可能知道,PHP中有许多请求方法,如OPTIONS、GET、POST、PUT、HEAD等,但不能在一个请求中混合使用其中的两个或多个方法。这就是我的问题开始的地方 我有一个HTTPRequest类,它有两个静态方法,创建它的实例-create(),以创建自定义HTTP请求和createFromGlobals(),以创建服务器接收的当前请求的实例 那么,有什么问题?问题是,我想找到一些方法来分离依赖于方法的请求附加函数(例如,当请求方法为PU

我目前正在编写自己的HTTP请求类,遇到了一个小问题。您可能知道,PHP中有许多请求方法,如OPTIONS、GET、POST、PUT、HEAD等,但不能在一个请求中混合使用其中的两个或多个方法。这就是我的问题开始的地方

我有一个HTTPRequest类,它有两个静态方法,创建它的实例-create(),以创建自定义HTTP请求和createFromGlobals(),以创建服务器接收的当前请求的实例

那么,有什么问题?问题是,我想找到一些方法来分离依赖于方法的请求附加函数(例如,当请求方法为PUT或POST时,我不想使用getQueryString()函数),我希望类为我这样做。另外,我希望保持类依赖关系松散,这样整个系统将保持灵活性


你知道有什么设计模式可以解决像我这样的问题吗?或者有什么方法可以解决这个问题吗?

看看Symfony组件,它有一个非常好的请求类(以及其他很多东西),所以你不必重新发明轮子


我可能会实现您想要实现的目标,与此类似(但请记住我关于查询字符串对POST请求有效的评论。至少就我所知):

用法:

$requestFromGlobals = HTTPRequest::createFromGlobals();
$customRequest = HTTPRequest::create( 'post', array( 'additional', 'arguments' ) );

我在考虑这样的事情:

<?php

class HTTPRequest
{
    protected $method;
    public $parameters
    // ...

    public static function create(/* ... */)
    {
        // ...
        switch ($this->method)
        {
            case 'GET':
                $this->parameters = new Parameters($_GET);
                break;
            case 'POST':
                $this->parameters = array(
                    'post' => new Parameters($_POST),
                    'files' => new Parameters($_FILES)
                );
                break;
            // ...
        }
        // ...
    }
}

对也包含查询字符串的uri执行
POST
请求是完全有效的。我想,
PUT
请求也是如此,但从来没有测试过。@fireeyedboy,就我而言,这在FastCGI或NSIS上运行得很好,但是Apache有一些问题(我不确定是什么问题,所以我不能给你任何具体的例子);在这方面,我从未遇到过Apache的问题。但是,你可能是对的。是的,我知道HTTP基金会,但是我这样做是为了练习,提高我的技能。实际上,重新阅读你的问题,你的方法的名字<代码>创建< /代码>,尤其是从GoalSales < /代码>应该已经放弃了你知道的SimfOI组件:-是的,我也在考虑它。但我不喜欢“方法类”名称是严格定义的,但不能有其他选择。最后,我将使“方法类”与请求类完全分离。不管怎样,谢谢。@SebastianPotastiak,但为什么?除了作为HTTP请求,这些类还有什么其他用途?不管你的推理是什么,如果你有PHP 5.4,你可以考虑使用。听起来这就是你想要的。但就我而言,traits不能只在某些条件下使用(我的意思是,我不影响某些函数是否按照请求方法实现);它们的工作方式更像是继承而不是松耦合,所以在这种情况下,我是使用traits还是简单地在请求类中实现所有必需的函数并不重要。
<?php

class HTTPRequest
{
    protected $method;
    public $parameters
    // ...

    public static function create(/* ... */)
    {
        // ...
        switch ($this->method)
        {
            case 'GET':
                $this->parameters = new Parameters($_GET);
                break;
            case 'POST':
                $this->parameters = array(
                    'post' => new Parameters($_POST),
                    'files' => new Parameters($_FILES)
                );
                break;
            // ...
        }
        // ...
    }
}