Php Laravel在控制器中使用公共静态函数是否不好

Php Laravel在控制器中使用公共静态函数是否不好,php,laravel,static-methods,Php,Laravel,Static Methods,在laravel控制器中使用公共静态功能是否不好 在我的产品模型中,我有一个如下所示的功能: public static function setEndDate($time) { if ($time == 2) { return Carbon::now()->addMonths(2)->toDateTimeString(); } else

在laravel控制器中使用公共静态功能是否不好

在我的产品模型中,我有一个如下所示的功能:

public static function setEndDate($time)
{
   if ($time == 2)                                                 
   {
         return Carbon::now()->addMonths(2)->toDateTimeString();
   }
   else                                                            
   {
         return Carbon::now()->addDays($time)->toDateTimeString();
   }

}
//Validation etc..

$time = Input::get('end_date'); //To transform end-time

$newProduct = new Product();

$newProduct->some_value = Input::get('some_value');
$newProduct->some_value = Input::get('some_value');


$newProduct->end_date = Product::setEndDate($time); //Using my static function like this


newProduct->save();
$newProduct->end_date = $time;
然后在我的控制器中,我使用如下函数:

public static function setEndDate($time)
{
   if ($time == 2)                                                 
   {
         return Carbon::now()->addMonths(2)->toDateTimeString();
   }
   else                                                            
   {
         return Carbon::now()->addDays($time)->toDateTimeString();
   }

}
//Validation etc..

$time = Input::get('end_date'); //To transform end-time

$newProduct = new Product();

$newProduct->some_value = Input::get('some_value');
$newProduct->some_value = Input::get('some_value');


$newProduct->end_date = Product::setEndDate($time); //Using my static function like this


newProduct->save();
$newProduct->end_date = $time;

像上面这样使用静态函数不好吗?

当您创建静态方法时,不会有任何固有的问题,但与所有文档一样,不建议这样做。为什么?

静态状态无处不在,并且完全破坏了可测试性,因为您不能仅仅重置状态。此外,任何东西都可能以代码的其他方面无法预测的方式影响状态,从而导致极不可预测的行为

Laravel 4通过使用静态“正面”来防止这种情况。这些外观是“国际奥委会决议的语法简写”。它们既提供语法上的糖分,又防止代码紧密耦合


facades解析的类可以更改,并允许您注入模拟系统或任何您想要的东西。

问题本身是基于观点的。我不会说在您的模型中使用这样的方法一定不好,尽管我也不建议这样做。(有关该检查的更多信息)

无论如何,雄辩为您的这个具体问题提供了一个更好的解决方案:

它们是一种“setter方法”,您可以在其中修改或更改将分配给属性的值。下面是一个例子:

public function setEndDateAttribute($time){
    if ($time == 2)                                                 
    {
        $this->attributes['end_date'] = Carbon::now()->addMonths(2)->toDateTimeString();
    }
    else                                                            
    {
        $this->attributes['end_date'] = Carbon::now()->addDays($time)->toDateTimeString();
    }
}
你是这样使用它的:

public static function setEndDate($time)
{
   if ($time == 2)                                                 
   {
         return Carbon::now()->addMonths(2)->toDateTimeString();
   }
   else                                                            
   {
         return Carbon::now()->addDays($time)->toDateTimeString();
   }

}
//Validation etc..

$time = Input::get('end_date'); //To transform end-time

$newProduct = new Product();

$newProduct->some_value = Input::get('some_value');
$newProduct->some_value = Input::get('some_value');


$newProduct->end_date = Product::setEndDate($time); //Using my static function like this


newProduct->save();
$newProduct->end_date = $time;

一般来说,使用静态调用是不好的(最佳实践不应该仅仅因为使用了最新的框架而改变)。它们导致与特定类名紧密耦合,通常隐藏全局状态(以静态变量的形式),并且对单元测试来说是一场噩梦。但你可能会在99.99%的拉威尔相关材料中看到它。做出你自己的结论…@tereško Laravel的核心几乎都不是静态方法。让它看起来像很多静态的,但在后台它实际上是一个服务定位器模式。@lukasgeiter,laravel的外观是服务定位器(这有点意味着它们是一个反模式),我没有说任何关于使用静态作用域的核心类的内容。我指出,使用laravel的代码几乎普遍以各种形式滥用静态作用域。只是想澄清一下,Laravel(核心)没有滥用静态范围。。。