Laravel 模型静态方法实现

Laravel 模型静态方法使用

目录

  • [Laravel 模型静态方法使用](#Laravel 模型静态方法使用 "#laravel-%E6%A8%A1%E5%9E%8B%E9%9D%99%E6%80%81%E6%96%B9%E6%B3%95%E4%BD%BF%E7%94%A8")
    • 目录
    • 静态方法的多种实现方式
      • [1. static关键字(优先推荐)](#1. static关键字(优先推荐) "#1-static%E5%85%B3%E9%94%AE%E5%AD%97%E4%BC%98%E5%85%88%E6%8E%A8%E8%8D%90")
      • [2. self关键字调用](#2. self关键字调用 "#2-self%E5%85%B3%E9%94%AE%E5%AD%97%E8%B0%83%E7%94%A8")
      • [3. (new static()) (不推荐)](#3. (new static()) (不推荐) "#3-new-static-%E4%B8%8D%E6%8E%A8%E8%8D%90")
      • [4. static和self的异同](#4. static和self的异同 "#4-static%E5%92%8Cself%E7%9A%84%E5%BC%82%E5%90%8C")

静态方法的多种实现方式

在Laravel模型中,可以采用static关键字、self关键字、(new static())来链式调用构造器方法,对外层业务层提供静态方法调用

1. static关键字(优先推荐)

定义:

static关键字是PHP5.3版本之后引入的特性,即后期静态绑定, 是运行时决定, 指向的是调用时的类,如果存在类继承,代表调用的类,可以是子类或父类;

在模型中, 如果存在查询作用域方法,可以使用static::query()进行调用,如果没有则直接static::调用

使用举例
php 复制代码
class User extends Model 
{
   protected $table = 'users';

   /**
    * 提供非删除状态的用户
    */
   public function scopeActiveStatus($query)
   {
     return $query->whereIn('status', [0, 1]);
   }

   /**
    * 根据名称查询用户数量
    */
   public static function countByName($name): int
   {
      // 不可以直接static::activeStatus(), 会报错
      return static::query()->activeStatus()->where('name', $name)->count()
   }

   /**
    * 根据ID数组获取用户信息
    */
   public static function countById($ids): int
   {
      return static::whereIn('id', $ids)->count();
   }
}

2. self关键字调用

定义:

self关键字是固定指向了定义了该方法的类,如果存在类继承,子类继承父类,且覆盖了父类方法,此时self调用得到的,还是父类的方法

使用举例
php 复制代码
class User extends Model 
{
   protected $table = 'users';

   /**
    * 提供非删除状态的用户
    */
   public function scopeActiveStatus($query)
   {
     return $query->whereIn('status', [0, 1]);
   }

   /**
    * 根据名称查询用户数量
    */
   public static function countByName($name): int
   {
      // 不建议直接self::activeStatus()调用, 虽然也能够使用,应该是某个语法糖,查询作用域作为应该用查询构造器的实例来调用
      return self::query()->activeStatus()->where('name', $name)->count()
   }

   /**
    * 根据ID数组获取用户信息
    */
   public static function countById($ids): int
   {
      return self::whereIn('id', $ids)->count();
   }
}

3. (new static()) (不推荐)

定义:

(new static())是实例化当前类的对象,指向的是调用时的类。 继承关系上与static相同。

不推荐此做法,本身是在实例化增加内存开销,而且在模型静态方法内使用,不符合场景

使用举例
php 复制代码
class User extends Model 
{
   protected $table = 'users';

   /**
    * 根据ID数组获取用户信息
    */
   public static function countById($ids): array
   {
      return (new static())->whereIn('id', $ids)->get()->toArray();
   }
}

4. static和self的异同

  • 两者在类没有继承关系时,得到的完全一样,没有区别,可以交换使用
  • 当存在继承关系时, 子类继承父类,并实现父类方法,此时static执行的是当前调用方法的类,即子类;而self 指向定义方法的类,即父类
  • 在模型中,更推荐static,因为它代表上下文中正在被调用的类
  • 参考文档\]\[[www.cnblogs.com/shizqiang/p...](https://link.juejin.cn?target=https%3A%2F%2Fwww.cnblogs.com%2Fshizqiang%2Fp%2F6277091.html "https://www.cnblogs.com/shizqiang/p/6277091.html")

相关推荐
菲兹园长16 分钟前
SpringBoot统一功能处理
java·spring boot·后端
muxue17825 分钟前
go语言封装、继承与多态:
开发语言·后端·golang
开心码农1号43 分钟前
Go语言中 源文件开头的 // +build 注释的用法
开发语言·后端·golang
北极象44 分钟前
Go主要里程碑版本及其新增特性
开发语言·后端·golang
lyrhhhhhhhh1 小时前
Spring框架(1)
java·后端·spring
喝养乐多长不高3 小时前
Spring Web MVC基础理论和使用
java·前端·后端·spring·mvc·springmvc
莫轻言舞3 小时前
SpringBoot整合PDF导出功能
spring boot·后端·pdf
玄武后端技术栈4 小时前
什么是死信队列?死信队列是如何导致的?
后端·rabbitmq·死信队列
老兵发新帖5 小时前
NestJS 框架深度解析
后端·node.js
码出钞能力6 小时前
对golang中CSP的理解
开发语言·后端·golang