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