类中的可选依赖项

时间:2017-05-03 10:15:11

标签: php class oop curl

我正在寻找以下方面的一些方向,我是OOP的新手并且到达那里但是认为我缺乏理解导致我陷入兔子洞或者我是只是过度思考和肛门。

基本上我有一个名为" CurlRequest"唯一的目的是执行curl请求,提供url和params它返回一些html。本课程按预期工作和运作,我很满意。

我将这个类用于一些项目,但是对于一个项目,我想跟踪我的请求的性能。尝试,失败,传递等,所以我为此创建了一个静态类来管理我的所有计数器。我在CurlRequest类的不同区域放置了如下的计数器引用。

PerformanceTracker::Increment('CurlRequest.Attempted');
PerformanceTracker::Increment('CurlRequest.Passed');
PerformanceTracker::Increment('CurlRequest.Failed');

我有大约10个这样的课程,我的班级在卷曲请求期间跟踪所有类型的事情,我也在我制作的其他课程中使用我的PerformanceTracker课程。

然而,如上所述,我只想为我的一个项目做这个,所以在我原来的CurlRequest类和一个带有性能计数器的改变的类的情况下找到我自己。

我的问题是,他们是否可以为任何项目使用相同的类,并选择使用PerformanceTracker类。我想到的显而易见的方法是将$ option参数传递给类,然后在所有计数器周围使用if语句,但无法帮助认为它是凌乱的。

            if ($this->options['perfCounter'] == true ) {

                PerformanceTracker::Increment($this->owner . '.CurlRequest.Failed');

            }

这也为课程增加了许多额外的代码。

3 个答案:

答案 0 :(得分:0)

我建议将if语句放在单独的方法中

private function handlePerformanceTracker($q) 
{
    if ($this->options['perfCounter'] == true ) {

        PerformanceTracker::Increment($q);

    }
}

并调用此方法,而不是调用

PerformanceTracker::Increment(...);

此外,如果您发现要在项目之间以不同方式跟踪性能,则更改构造函数以接受可调用参数可能很有用,这样您就可以从CurlRequest类本身外化实际实现。

public function __construct(..., callable performanceHandler) 

然后当你实例化你的课时:

$curlRequest = new CurlRequest(..., function($outcome) {
    //your implementation
});

答案 1 :(得分:0)

您可以使用继承并创建一个子类,在委托父方法之前执行日志记录:

class PerformanceTracker
{
    static function Increment($s)
    {
        echo $s;
    }
}

class CurlRequest
{
    function get($url){


        //preform curl request, save html to variable etc
        //dummy vars used here so working example code
        $html = 'html here';
        $curlError = false;
        if($curlError){
            $this->error($curlError);
        }


        return $this->success($html);
    }
    protected function success($html)
    {
        return $html;
    }

    protected function error($curlError)
    {
        throw new Exception($curlError);
    }

}

class LoggingCurlRequest extends CurlRequest
{


    function get($url)
    {
        PerformanceTracker::Increment('CurlRequest.Attempted');
        return parent::get($url);
    }

    function success($html)
    {
        PerformanceTracker::Increment('CurlRequest.Passed');
        return parent::success($html);
    }

    function error($curlError)
    {
        PerformanceTracker::Increment('CurlRequest.Failed');
        parent::error($curlError);
    }
}



$lcr = new LoggingCurlRequest();

$lcr->get('unused in example');

由于我使用带有最少代码的虚拟类来演示该技术,其好处可能并不明显,但在实际代码中,CurlRequest类中的方法将更复杂,但是日志记录类中的方法将保持为两个内衬,具有日志功能和对父方法的调用。

使用这种技术,你可以修改父类而不影响派生类(假设方法签名没有改变),可以创建其他派生类(如何使用CachingCurlRequest)等。

要获得OOP的全部好处,您应该查看依赖注入和接口

答案 2 :(得分:0)

从OOP的角度来看,您可以使用'Null' object pattern。这只是意味着CurlRequest类使用的依赖是抽象的(可能是接口?)。然后,您将拥有PerformanceTracker的两个具体实现:您今天拥有的一个实现,一个什么都不执行(它没有任何行为)。通过这种方式,当您实例化CurlRequest类时,它将使用具有行为的具体实现,对于所有其他项目,它将使用没有行为的具体实现。 CurlRequest中的所有代码看起来都是一样的,但它会有不同的行为,具体取决于它使用的具体实现