实例化调用和静态调用同一个方法的实现
在laravel的使用过程中,发现了数据库查询构造器的同一个方法既可以::调用,又可以使用->调用:
$list = Users::take(10)->get();
$list = Users::model()->take(10)->get(); // Users::model()返回的是Users对象
可见 take(10) 方法的使用。
于是查看了一下源码,Users 继承了 Model类,
在 Model类中有个静态魔术方法
public function __call($method, $parameters)
{
if (in_array($method, ['increment', 'decrement'])) {
return $this->$method(...$parameters);
}
return $this->forwardCallTo($this->newQuery(), $method, $parameters);
}
public static function __callStatic($method, $parameters)
{
return (new static)->$method(...$parameters);
}
可见它是实例化了自己然后去调用的。
关于其中的...语法,参见另一篇详解。
实例化调用和静态调用同一个方法的实现
最新推荐文章于 2022-09-12 10:30:19 发布