Laravel 如何实现既能静态调用,又能动态调用

首先要知道类当中方法访问控制。

  • public 公开的,可以被继承,也可以被外部访问。
  • protected 可以被继承,但是不可以被外部访问。
  • private 不可以被继承,也不能被外部访问。

在laravel中,有一些方法不管是静态调用,还是动态调用,都能够使用。这都要归功于php的__callStatic__call魔术方法以及laravel作者的设计。

class Model
{
    protected function increment($column, $amount = 1, array $extra = [])
    {
        return $this->incrementOrDecrement($column, $amount, $extra, 'increment');
    }

    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);
    }
}

举个例子,比如说有一个用户表,里面有一个年龄字段,我们想要让年龄能够自增,于是我们有两种写法

  • (new User)->increment('age');
  • User::increment('age');

首先看第一种,因为我们User继承了Model类,但是increment方法前有个protected导致我们无法从外部访问这个方法。但是不用慌张,这个时候__call魔术方法就起到了效果,他会帮我们去访问increment方法。

第二种,我们用静态调用increment方法,运行的时候,程序就去找有没有定义的静态increment方法,找了一圈没有找到,怎么办?这个时候__callStatic开始发挥作用。我们用的是User类,因为延迟静态绑定的缘故,可以看成:

return (new User)->increment('age');

是不是回到了第一种写法的样子。

基础真滴很重要!!!

本作品采用《CC 协议》,转载必须注明作者和本文链接
不积跬步无以至千里
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!