软件教程 2025年08月6日
0 收藏 0 点赞 711 浏览 2284 个字
摘要 :

文章目录 一、Laravel模型静态方法概述 二、静态方法的实现方式 (一)使用static关键字(优先推荐) (二)使用self关键字调用 (三)使用(new static())(不推荐) ……




  • 一、Laravel模型静态方法概述
  • 二、静态方法实现方式
    • (一)使用static关键字(优先推荐)
    • (二)使用self关键字调用
    • (三)使用(new static())(不推荐)
  • 三、static和self的异同点

在Laravel开发中,模型静态方法的运用十分广泛,它能为业务层提供便捷的调用方式。接下来,咱们详细探讨一下Laravel模型静态方法的多种实现方式及其特点。

一、Laravel模型静态方法概述

在Laravel框架里,模型静态方法允许开发者通过链式调用构造器方法,给外层业务层提供方便的静态调用接口。这在进行数据查询、处理等操作时,极大地简化了代码,提高了开发效率。下面具体看看实现模型静态方法的几种途径。

二、静态方法的实现方式

(一)使用static关键字(优先推荐)

  1. 原理讲解
    static关键字是从PHP5.3版本开始引入的特性,它实现了后期静态绑定。简单来说,这意味着在运行时,static会根据调用的情况来决定指向哪个类。要是存在类继承关系,它代表的就是调用时的类,这个类既可能是子类,也可能是父类。在Laravel模型中,如果模型里有查询作用域方法,我们可以使用static::query()来调用;要是没有查询作用域方法,那就直接用static::来调用相关方法。
  2. 代码示例
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();
   }
}

在这个例子里,countByNamecountById方法都借助static关键字来调用查询构造器,进而实现相应的查询功能。

(二)使用self关键字调用

  1. 原理讲解
    self关键字和static有所不同,它固定指向定义了该方法的类。当存在类继承关系,子类继承父类并且覆盖了父类的方法时,使用self调用得到的依然是父类的方法。
  2. 代码示例
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();
   }
}

从代码中可以看出,self的使用方式和static类似,但在继承场景下,二者的表现存在差异。

(三)使用(new static())(不推荐)

  1. 原理讲解
    (new static())这种方式实际上是实例化当前类的对象,在继承关系上,它和static一样,指向调用时的类。不过,这种做法并不推荐。因为在模型静态方法里使用它,会额外增加内存开销,而且这种使用方式与模型静态方法的使用场景不太契合。
  2. 代码示例
class User extends Model 
{
   // 关联数据表
   protected $table = \'users\';

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

虽然这种方式能实现功能,但考虑到性能和使用场景,在实际开发中应尽量避免使用。

三、static和self的异同点

当类之间不存在继承关系时,staticself的表现完全一样,在这种情况下,二者可以相互替换使用。然而,一旦存在继承关系,情况就有所不同。当子类继承父类并实现了父类方法时,static执行的是当前调用方法的类,也就是子类;而self始终指向定义方法的类,即父类。在Laravel模型开发中,由于static代表的是上下文中正在被调用的类,能更好地适应复杂的继承场景,所以更推荐使用static关键字来实现模型静态方法。

通过以上对Laravel模型静态方法多种实现方式的分析,希望能帮助大家在开发中根据实际需求。

微信扫一扫

支付宝扫一扫

版权: 转载请注明出处:https://www.zuozi.net/6839.html

管理员

相关推荐
2025-08-06

文章目录 一、Promise基础回顾 二、Promise 与 axios 结合使用场景及方法 (一)直接返回 axios …

269
2025-08-06

文章目录 一、模块初始化时的内部机制 二、常见导出写法的差异分析 (一)写法一:module.exports…

107
2025-08-06

文章目录 一、ResizeObserver详解 (一)ResizeObserver是什么 (二)ResizeObserver的基本用法 …

683
2025-08-06

文章目录 一、前期准备工作 (一)下载相关文件 (二)安装必要工具 二、处理扣子空间生成的文件…

338
2025-08-06

文章目录 一、官方文档 二、自动解包的数据类型 ref对象:无需.value即可访问 reactive对象:保持…

371
2025-08-06

文章目录 一、Hooks的工作原理 二、在if语句中使用Hook会出什么岔子? 三、React官方的Hook使用规…

843
发表评论
暂无评论

还没有评论呢,快来抢沙发~

助力内容变现

将您的收入提升到一个新的水平

点击联系客服

在线时间:08:00-23:00

客服QQ

122325244

客服电话

400-888-8888

客服邮箱

122325244@qq.com

扫描二维码

关注微信客服号