浅谈Laravel中的一个后期静态绑定

发布时间 - 2026-01-11 02:44:37    点击率:

关于 PHP  的 new static 延迟静态绑定,或者叫后期静态绑定,在 Laravel 中遇到一个使用上的问题。如下,在 Laravel 中调用 Model 新增数据的时候,首先给 Model 加了一个获取分表的方法:

protected function addToMessage($msgType, $userID, $commentID, $replyCommentID, $replyUserID, $gameID)
{
  if (!$userID) {
    return false;
  }
 
  $table = 't_message_' . hashID($userID, 100);
  $this->message->setTable($table)->create([
    'msg_type'     => $msgType,
    'user_id'     => $userID,
    'comment_id'    => $commentID,
    'reply_comment_id' => $replyCommentID,
    'reply_user_id'  => $replyUserID,
    'game_id'     => $gameID,
    'is_read'     => 0,
    'created_at'    => date('Y-m-d H:i:s'),
  ]);
  return true;
}

这里 setTable 方法是在 Model 里定义的获取分表的方法:

public function setTable($table)
{
  $this->table = $table;
  return $this;
}

从报错日志中发现 $this->table 并没有生效,但实际上在调用 create 方法之前打印表名的时候是期望的值,这里调用 create 方法为什么 $this->table 没有被重置呢?

这里 $this->message 是一个继承 Model 类的模型类,其中 create 方法:

public static function create(array $attributes = [])
{
  $model = new static($attributes);
 
  $model->save();
 
  return $model;
}

位于 vendor\laravel\framework\src\Illuminate\Database\Eloquent\Model.php Line 557.

因为 Laravel 框架的这个 Model 类是一个 abstract 类型,PHP 中 abstract 类可以用 new static 后期静态绑定的方式实例化,而 create 方法里 $model = new static($attributes) 实际上就是重新实例化了并返回,而调用者 Model 类没有定义 table 属性,所以这个时候 $this->table 是没有值的。

解决办法是用 save 方法即可,如图所示。实际上 create 方法也调用了 save 方法。

实验

一个抽象类 A,有个 create 方法,通过延迟静态绑定实例化并返回。B 类继承 A,test 方法中修改父类的 name 属性。

<?php
 
abstract class A
{
  protected $name = "tanteng";
 
  public static function create()
  {
    return new static();
  }
}
 
class B extends A
{
  //protected $name = '纸牌屋弗兰克';
 
  public function test()
  {
    $this->name = "Tony Tan";
    return $this;
  }
}
 
$obj1 = (new B)->test();
$obj2 = (new B)->test()->create();
var_dump($obj1);
var_dump($obj2);

结果显示 $obj1 和 $obj2 这两个实例都是 B 的实例,调用 test 方法属性 name 改变了,但是调用 create 方法后,name 属性并没有改变。 这也就是在本文中说的在 Lavarel 中遇到的场景。 (这里如果把注释打开,打印的 name 就是重写的值)

如果把抽象类 A 改成普通类,new static 改成 new self 的方式实例化,结果就不同了,打印的属性 name 都是各自类的属性。

参考链接

PHP:后期静态绑定

PHP中new self()和new static()的区别 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# Laravel  # 后期静态绑定  # php  # Laravel 5框架学习之模型、控制器、视图基础流程  # Laravel模型事件的实现原理详解  # laravel学习笔记之模型事件的几种用法示例  # 使用laravel的Eloquent模型如何获取数据库的指定列  # Laravel 模型关联基础教程详解  # Laravel使用模型实现like模糊查询的例子  # Laravel模型间关系设置分表的方法示例  # Laravel 关联模型-关联新增和关联更新的方法  # Laravel关系模型指定条件查询方法  # laravel框架模型中非静态方法也能静态调用的原理分析  # 绑定  # 都是  # 是一个  # 后期  # 是在  # 有个  # 抽象类  # 可以用  # 这也  # 这两个  # 这个时候  # 重写  # 报错  # 解决办法  # 中说  # 大家多多  # 弗兰克  # 如图所示  # 改变了  # 就是在 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何使用Blade组件和插槽?(Component代码示例)  如何在宝塔面板中修改默认建站目录?  Python进程池调度策略_任务分发说明【指导】  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  敲碗10年!Mac系列传将迎来「触控与联网」双革新  Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)  微信小程序 require机制详解及实例代码  简历在线制作网站免费版,如何创建个人简历?  简单实现Android验证码  Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)  Linux网络带宽限制_tc配置实践解析【教程】  如何用wdcp快速搭建高效网站?  微信小程序 闭包写法详细介绍  linux top下的 minerd 木马清除方法  google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤  制作旅游网站html,怎样注册旅游网站?  PHP 500报错的快速解决方法  Laravel项目怎么部署到Linux_Laravel Nginx配置详解  韩国服务器如何优化跨境访问实现高效连接?  如何为不同团队 ID 动态生成多个“认领值班”按钮  Laravel storage目录权限问题_Laravel文件写入权限设置  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  北京网站制作的公司有哪些,北京白云观官方网站?  jQuery validate插件功能与用法详解  C++用Dijkstra(迪杰斯特拉)算法求最短路径  Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用  如何在景安云服务器上绑定域名并配置虚拟主机?  装修招标网站设计制作流程,装修招标流程?  Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】  网站制作价目表怎么做,珍爱网婚介费用多少?  如何在万网开始建站?分步指南解析  如何在香港服务器上快速搭建免备案网站?  软银砸40亿美元收购DigitalBridge 强化AI资料中心布局  Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲  千库网官网入口推荐 千库网设计创意平台入口  如何快速登录WAP自助建站平台?  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】  php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】  如何在腾讯云服务器上快速搭建个人网站?  Laravel PHP版本要求一览_Laravel各版本环境要求对照  Laravel观察者模式如何使用_Laravel Model Observer配置  Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  Linux系统运维自动化项目教程_Ansible批量管理实战  C++时间戳转换成日期时间的步骤和示例代码  海南网站制作公司有哪些,海口网是哪家的?  Laravel如何创建和注册中间件_Laravel中间件编写与应用流程  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?