Php 调用static::<;功能>;但函数不';不存在,但它起作用(拉威尔5号特别雄辩,但它并不真正重要)

Php 调用static::<;功能>;但函数不';不存在,但它起作用(拉威尔5号特别雄辩,但它并不真正重要),php,Php,我一直在想为什么会这样。我使用Laravel5.1已经有一段时间了,现在我想创建自己的框架(仅用于学习目的)。目前我正在研究模型和数据库连接,还有这个文件。它通过模型(如状态和用户模型)进行扩展 这是一个抽象模型类,还不错。当设置一个Laravel5.1项目时,将有一个用户类来扩展它,这是可以执行的 User::where('username','Rasmus') User是扩展抽象模型类的用户模型 “用户名”指的是数据库列的名称 “拉斯姆斯”是它在那个专栏里寻找的,它是我的名字 这个问题中有

我一直在想为什么会这样。我使用Laravel5.1已经有一段时间了,现在我想创建自己的框架(仅用于学习目的)。目前我正在研究模型和数据库连接,还有这个文件。它通过模型(如状态和用户模型)进行扩展

这是一个抽象模型类,还不错。当设置一个Laravel5.1项目时,将有一个用户类来扩展它,这是可以执行的

User::where('username','Rasmus')

User是扩展抽象模型类的用户模型

“用户名”指的是数据库列的名称

“拉斯姆斯”是它在那个专栏里寻找的,它是我的名字

这个问题中有趣的部分和主要的事情是,模型类和用户类中都没有“where”方法。模型类不继承任何内容。有人能解释一下,当这个方法不存在时,(调用User::where)为什么会这样做吗

很高兴知道的是
static::where(…)
在抽象模型类中也被调用了几次

真的,拉斯穆斯·罗森格伦


作为一名PHP学习者,我不是编程专家,我希望得到更好的答案。但是,您可能对第447行的内容感兴趣。在Model.php上,您可以看到它在第27行使用QueryBuilder


正如我所记得的,Laravel使用trait处理多个代码重用。这是一个相当高级的主题,非常有趣。

模型的
\u call()
函数将其传递给
QueryBuilder
实例(中间有几个步骤,但这是基本的最终结果)


\u call()
是一种允许应用程序处理丢失/无法访问的方法名的方法。在本例中,它允许各种
where()
方法(包括能够执行诸如
whereUsername('Rasmus')
等明确未定义的函数)工作。

看起来该框架使用了对象变形和特征。该方法在
Eloquent\Builder
类中定义。这很优雅,但速度非常慢,因为它依赖于反射。@arkascha它不依赖于反射。请参见
模型中的
\uuuu call()
。谢谢,没有看到它,如果调用的方法(即神奇方法调用)是任何其他递增或递减的方法,它将切换到查询生成器。谢谢我花了好几年才弄明白。。。我在看uu callStatic magic method:)
public function __call($method, $parameters)
{
    ...

    $query = $this->newQuery();
    return call_user_func_array([$query, $method], $parameters);
}