调用static::<;函数>;但是函数没有';不存在,但它有效(特别是拉拉威尔5 Eloquent,但它


Call to static::<function> but function doesn't exist but it works (Laravel 5 Eloquent in particular, but it doesn't really matter)

我一直想知道为什么这样做有效。我使用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来处理一些代码重用。这是一个相当高级的话题,非常有趣。