为什么在PHP中使用静态方法';什么是拉威尔模型班?

为什么在PHP中使用静态方法';什么是拉威尔模型班?,php,design-patterns,laravel,singleton,static-methods,Php,Design Patterns,Laravel,Singleton,Static Methods,在PHP laravel中,我们有如下代码 $user = User::find(1); var_dump($user->name); 我关心的不是如何使用find方法,而是为什么laravel使用静态方法?静态方法的使用是否会使该方法难以测试 如果他们使用单例设计会更好吗 e、 g 这将限制系统只有一个用户。虽然find方法可能是静态的,但User类将具有其他非静态的方法和属性,您的示例中可能有一个例子:$User->name 一种不依赖于任何实例变量的方法,即变量的值特定于特定对象实

在PHP laravel中,我们有如下代码

$user = User::find(1);
var_dump($user->name);
我关心的不是如何使用
find
方法,而是为什么laravel使用静态方法?静态方法的使用是否会使该方法难以测试

如果他们使用单例设计会更好吗

e、 g


这将限制系统只有一个用户。虽然
find
方法可能是静态的,但User类将具有其他非静态的方法和属性,您的示例中可能有一个例子:
$User->name


一种不依赖于任何实例变量的方法,即变量的值特定于特定对象实例,而是提供适用于所有实例的通用功能的方法,可以而且可能应该是静态的。这就是为什么
$This
操作符在静态方法中是非法的,因为它不能引用特定的对象实例。

事实上,您的示例与Laravel在幕后所做的非常相似。当您执行
User::find()
时,实际上是在请求一个新实例,一个Collection实例或一个QueryBuilder实例

illumb\Database\elount\Model():

public static function find($id, $columns = array('*'))
{
    if (is_array($id) && empty($id)) return new Collection;

    $instance = new static;

    return $instance->newQuery()->find($id, $columns);
}

作为旁注,您还将看到在Laravel中使用静态方法的另一种方法,例如
Input::get()
。这些被称为正面

Facades为应用程序的IoC容器中可用的类提供“静态”接口。。。Laravel“facades”充当IoC容器中底层类的“静态代理”,提供简洁、表达性语法的好处,同时保持比传统静态方法更高的可测试性和灵活性

当用户引用服务器上的任何静态方法时。。。在facade中,Laravel解析来自IoC容器的缓存绑定,并针对该对象运行请求的方法(在本例中为get)


你可以在以下网址阅读更多关于拉拉维立面的信息:

Unnawut有一个很好的答案,但是我觉得有必要添加进一步的解释

在你的例子中

$user = User::find(1);
var_dump($user->name);
拉威尔没有使用静态方法,你是。您可能正在寻找的另一种方法是使用依赖项注入,Laravel使之非常容易,因为它可以自动完成。因此,无论在哪个类中使用
用户
模型,都应该在构造函数中设置类似的内容

public function __construct(User $user)
{
    $this->user = $user;
}
然后可以修改代码,使其不使用静态绑定

$user = $this->user->find(1);
var_dump($user->name);
用户对象不具备搜索用户的知识

您需要一种过滤器或集合对象,
::find()
方法帮助您创建该集合过滤器,并将结果转换为有用的实体

对于
用户
实体的使用,您只需更改属性的值并检索值。实体没有责任根据条件搜索实例


使用此逻辑,您将能够在原子块中解耦代码中的逻辑。

类用户扩展照亮\数据库\雄辩\模型
用户
不是门面类对,您发现了我的一个巨大错误。修改了我的答案。另外,立面(设计模式)不需要是静态的。哇!!我们能在每一面都这样做吗?我可以注入邮件外观,然后执行$this->Mail->send吗?太棒了!非常感谢。令人惊叹的!从拉威尔开始,这是一个真正有帮助的人!是这样吗?我真搞不懂这是怎么回事。构造函数中的typehint没有告诉Laravel注入
用户的实例吗?
User
是一个雄辩模型的实例,该模型没有
find()
方法。我遗漏了什么?你是对的,它不在模型课上。它位于
illumb\Database\elount\Builder
类中。但是它是通过
illumb\Database\Eloquent\Eloquent\Model
类的
\uu callStatic
魔术方法访问的。
$user = $this->user->find(1);
var_dump($user->name);