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