我一直想知道为什么会这样。我已经使用Laravel 5.1一段时间了,现在我想创建自己的框架(仅用于学习目的)。目前我进入模型和数据库连接,然后有这个文件。这是由模型扩展的,例如状态和用户模型。
https://github.com/illuminate/database/blob/master/Eloquent/Model.php
这是抽象的Model类,它不是太糟糕。在设置Laravel 5.1项目时,会有一个扩展了它的User类,可以执行
User::where('username', 'Rasmus');
User是扩展抽象Model类
的用户模型'username'指的是数据库列
'Rasmus'是它在该专栏中寻找的东西,它是我的名字......
这个问题的有趣部分和主要内容是Model类中没有“where”方法,也没有User类。 Model类不会继承任何东西。当某个方法不存在时,有人可以向我解释为什么会这样做(调用User :: where)。
很高兴知道在抽象的Model类中也会多次调用static::where(...);
。
此致,Rasmus Rosengren
PHP学习者
答案 0 :(得分:1)
Model
的{{1}}函数会将其传递给__call()
个实例(介于两者之间,但这是最基本的结果)。
QueryBuilder
public function __call($method, $parameters)
{
...
$query = $this->newQuery();
return call_user_func_array([$query, $method], $parameters);
}
是a magic method,它允许应用程序处理丢失/不可访问的方法名称。在这种情况下,它允许各种__call()
方法(包括能够执行明确未定义的函数,如where()
)等工作。
答案 1 :(得分:0)
我不是编程专家,我希望能得到更好的答案。但是,您可能会对第447行的QueryBuilder感兴趣。在Model.php上,您可以看到它在第27行使用QueryBuilder。
我记得Laravel使用trait处理多个代码重用。这是一个相当高级的话题 - 非常有趣。