laravel框架模型中非静态方法也能静态调用的原理分析

吾爱主题 阅读:135 2021-09-17 12:20:00 评论:0

本文实例讲述了laravel框架模型中非静态方法也能静态调用的原理.分享给大家供大家参考,具体如下:

刚开始用laravel模型时,为了方便一直写静态方法,进行数据库操作。

?
1 2 3 4 5 6 7 8 9 10 <?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class User extends Model {    public static function getList()    {      return self::get()->toArray();    } }

直到有朋友告诉可以不用这么写,声明一个 protected 方法,方法中用 $this。在外部使用时,也可以像调静态函数一样调用。

?
1 2 3 4 5 6 7 8 9 10 <?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class User extends Model {    protected function getList()    {      return $this ->get()->toArray();    } }

试了一下,发现还真可以,按理说受保护的 protected 非静态方法,在外部是无法这么调用的 User::getList() 。

但是在 laravel 中就可以,查看了下 Model 基类的代码,原来是因为实现了 __call() 和 __callStatic() 这两个魔术方法。

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 class 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 );    } }

我们试着自已实现下这两个魔术方法,看看效果。

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 <?php namespace App\Models; class Model {    //在对象中调用一个不可访问方法时,__call()被调用    public function __call( $method , $parameters )    {      echo '__call()' ;      return $this ->{ $method }(... $parameters );    }    //在静态上下文中调用一个不可访问方法时,__callStatic()被调用    public static function __callStatic( $method , $parameters )    {      echo '__callStatic()' ;      //注意这里,通过延迟静态绑定,仍然new了一个实例      return ( new static )->{ $method }(... $parameters );    }    private function test()    {      echo '被调用了<br>' ;    } }

我们尝试调用 test() 方法。

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <?php namespace App\Http\Controllers\Test; use Illuminate\Http\Request; use App\Http\Controllers\Controller; use App\Models\Model; class Test extends Controller {    public function index(Request $request )    {      //对象调用      ( new Model())->test();      //静态方法调用      Model::test();    } }

结果显示调用成功。

希望本文所述对大家基于Laravel框架的PHP程序设计有所帮助。

原文链接:https://www.cnblogs.com/jkko123/p/10805425.html

可以去百度分享获取分享代码输入这里。
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

【腾讯云】云服务器产品特惠热卖中
搜索
标签列表
    关注我们

    了解等多精彩内容