eloquent为何无需实例化就能调用类的方法?或者内部是怎么实现实例化的?
使用eloquent操作数据库,只需定义一个类就可以和数据库中的表关联
<?php
class Article extends \Eloquent {
protected $fillable = [];
}
如果想查找某条记录
$article = Article::find(2);
echo $article->title;
但问题是如果直接用 :: 来访问某个 function,无论这个 function 是否为 static,构造函数 __construct() 都不会被调用,那么创建对象实例在eloquent中是如何实现的呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
难道是用的Laravel 4
extends Eloquent
因为Laravel 5是
extends Model
Model 中 构造函数一般情况下是没用的,除非用于
create
/fill
操作Model.php
中没有的静态函数、非静态函数的调取方式如下:这是魔术方法,看手册,然后自己多想一下是怎么调用的。
这段的确很绕,但是看懂了也就明白了Model的运行机制
源码地址
另外这里使用
static
(实例化运行时的类,例如你的Article
)和self
(实例化Model)是有区别的。刚好前段时间实现一个sql解释器demo,你看看,大概一个意思,不明白再问我即可
使用 https://github.com/TIGERB/eas...
源码 https://github.com/TIGERB/eas...
暂时没翻过这个源码,但是我可以肯定的是他的做法。
怎么做到的?
1、php的魔术方法,当调用一个静态方法不存在的时候调用
__callStatic
这个函数。2、__callStatic这个函数里面先判断是否有初始化这个Article,如果没有,那么初始化,返回
实例
。以上。