浅谈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中间件编写与应用流程
怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?
武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?

