eloquent为何无需实例化就能调用类的方法?或者内部是怎么实现实例化的?

发布于 2022-09-04 08:48:52 字数 354 浏览 15 评论 0

使用eloquent操作数据库,只需定义一个类就可以和数据库中的表关联

<?php

class Article extends \Eloquent {

protected $fillable = [];

}

如果想查找某条记录


$article = Article::find(2);

echo $article->title;

但问题是如果直接用 :: 来访问某个 function,无论这个 function 是否为 static,构造函数 __construct() 都不会被调用,那么创建对象实例在eloquent中是如何实现的呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

ペ泪落弦音 2022-09-11 08:48:52

难道是用的Laravel 4
extends Eloquent

因为Laravel 5是
extends Model

Model 中 构造函数一般情况下是没用的,除非用于create/fill操作
Model.php没有的静态函数、非静态函数的调取方式如下:

function __call(){
    $query = $this->newQuery();  //这里new 的Builder

    return call_user_func_array([$query, $method], $parameters); //之后都是调取的Builder的对象,比如find,where
}

function __callStatic(){
    $instance = new static;
    return call_user_func_array([$instance, $method], $parameters); //调取上面的 __call
}

这是魔术方法,看手册,然后自己多想一下是怎么调用的。
这段的确很绕,但是看懂了也就明白了Model的运行机制

書生途 2022-09-11 08:48:52

下面是github laravel5.3版本的实现方法。

/**
 * Handle dynamic static method calls into the method.
 *
 * @param  string  $method
 * @param  array  $parameters
 * @return mixed
 */
public static function __callStatic($method, $parameters)
{
    return (new static)->$method(...$parameters);
}

源码地址

另外这里使用static(实例化运行时的类,例如你的Article)和self(实例化Model)是有区别的。

香草可樂 2022-09-11 08:48:52

刚好前段时间实现一个sql解释器demo,你看看,大概一个意思,不明白再问我即可

使用 https://github.com/TIGERB/eas...

例如,
  SqlInterpreter::db('user')->insert([
    'nickname' => 'tigerb',
    'mobile'   => '1366666666',
    'password' => '123456'
  ]);

源码 https://github.com/TIGERB/eas...

锦爱 2022-09-11 08:48:52

暂时没翻过这个源码,但是我可以肯定的是他的做法。

public static function __callStatic($method, $params) {
    if(is_null(self::$article)) {
        self::$article = new Article();
    }

    call_user_func_array([self::$article, $method], $params);
}

怎么做到的?
1、php的魔术方法,当调用一个静态方法不存在的时候调用__callStatic这个函数。
2、__callStatic这个函数里面先判断是否有初始化这个Article,如果没有,那么初始化,返回实例

以上。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文