Laravel -静态方法与静态instance()方法的区别



我在许多Laravel应用程序中看到这种做法,我不知道使用这种做法的原因有什么不同。

在类中不使用公共静态方法,许多人只编写一个静态函数来检索类的实例,这个实例调用该函数。

这个类没有属性或任何需要使函数工作的东西,所以我不明白为什么要用这种方式工作。我认为这使得代码在很多情况下更难以阅读。

示例,我看到了这个小实现:

class MyClass
{
public static function instance()
{
return new MyClass();
}
public function myStuff()
{
//my stuff
}
}
//Calling it
MyClass::instance()->myStuff();

我认为这将是更具可读性和相同的结果,使所有的静态函数,如:

class MyClass
{    
public static function myStuff()
{
//my stuff
}
}
//Calling it
MyClass::myStuff();

你觉得这个怎么样?

在链式可选方法的情况下,为类创建一个构造函数,然后将方法设置为非静态和自返回是很有意义的。

class Burger
{
private Collection $ingredients;

public static function instance()
{
$burger = new self;
$burger->ingredients = collect([]);
return $burger;
}
public function addCheese() : self
{
$this->ingredients->push('cheese');
return $this;
}

public function addMeat() : self
{
$this->ingredients->push('meat');
return $this;
}
}
$burger = Burger::instance()
->addCheese()
->addMeat()
->addCheese();

Laravel中的许多类都使用这个模式,包括Eloquent Models。

$posts = Post::query()
->where('author_id', 2)
->whereHas('tag', fn($tag) => $tag->where('name', 'games')
->get();

可以使用传统的构造函数来代替静态方法,但是您必须使用关键字new和括号来实例化它,这看起来不那么好:

$burger = (new Burger)
->addCheese()
->addMeat()
->addCheese();

如果类只有构造函数和另一个方法,可能是为了在将来通过模拟类来使类的自动化测试更容易。

我们了解你的担忧。很难说哪个更好,这取决于你的项目、你的风格和你的业务。但是我们可以给你一个关键字来了解更多:Singleton Pattern

最新更新