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")

相关推荐
一 乐6 小时前
婚纱摄影网站|基于ssm + vue婚纱摄影网站系统(源码+数据库+文档)
前端·javascript·数据库·vue.js·spring boot·后端
码事漫谈7 小时前
Protocol Buffers 编码原理深度解析
后端
码事漫谈7 小时前
gRPC源码剖析:高性能RPC的实现原理与工程实践
后端
踏浪无痕8 小时前
AI 时代架构师如何有效成长?
人工智能·后端·架构
程序员小假9 小时前
我们来说一下无锁队列 Disruptor 的原理
java·后端
武子康10 小时前
大数据-209 深度理解逻辑回归(Logistic Regression)与梯度下降优化算法
大数据·后端·机器学习
maozexijr10 小时前
Rabbit MQ中@Exchange(durable = “true“) 和 @Queue(durable = “true“) 有什么区别
开发语言·后端·ruby
源码获取_wx:Fegn089510 小时前
基于 vue智慧养老院系统
开发语言·前端·javascript·vue.js·spring boot·后端·课程设计
独断万古他化10 小时前
【Spring 核心: IoC&DI】从原理到注解使用、注入方式全攻略
java·后端·spring·java-ee
毕设源码_郑学姐10 小时前
计算机毕业设计springboot基于HTML5的酒店预订管理系统 基于Spring Boot框架的HTML5酒店预订管理平台设计与实现 HTML5与Spring Boot技术驱动的酒店预订管理系统开
spring boot·后端·课程设计