调用static :: <function>但是函数不存在但是它有效(特别是Laravel 5 Eloquent,但它并不重要)

时间:2015-11-15 12:52:38

标签: php

我一直想知道为什么会这样。我已经使用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学习者

2 个答案:

答案 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处理多个代码重用。这是一个相当高级的话题 - 非常有趣。