• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    laravel框架模型中非静态方法也能静态调用的原理分析

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

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

    ?php
    namespace App\Models;
    use Illuminate\Database\Eloquent\Model;
    class User extends Model
    {
      public static function getList()
      {
        return self::get()->toArray();
      }
    }
    
    

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

    ?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() 这两个魔术方法。

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

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

    ?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() 方法。

    ?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相关内容感兴趣的读者可查看本站专题:《Laravel框架入门与进阶教程》、《php优秀开发框架总结》、《php面向对象程序设计入门教程》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

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

    您可能感兴趣的文章:
    • Laravel6.2中用于用户登录的新密码确认流程详解
    • Laravel 5框架学习之模型、控制器、视图基础流程
    • Laravel 5.4重新登录实现跳转到登录前页面的原理和方法
    • Laravel中间件实现原理详解
    • Laravel模型事件的实现原理详解
    • 浅谈Laravel队列实现原理解决问题记录
    • Laravel框架队列原理与用法分析
    • Laravel认证原理以及完全自定义认证详解
    • Laravel框架生命周期与原理分析
    • 浅谈laravel aliases别名的原理
    • laravel 框架执行流程与原理简单分析
    上一篇:laravel框架中路由设置,路由参数和路由命名实例分析
    下一篇:laravel框架中控制器的创建和使用方法分析
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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