关于 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框架模型中非静态方法也能静态调用的原理分析
# 绑定
# 都是
# 是一个
# 后期
# 是在
# 有个
# 抽象类
# 可以用
# 这也
# 这两个
# 这个时候
# 重写
# 报错
# 解决办法
# 中说
# 大家多多
# 弗兰克
# 如图所示
# 改变了
# 就是在
相关文章:
如何选择长沙网站建站模板?H5响应式与品牌定制哪个更优?
网站制作壁纸教程视频,电脑壁纸网站?
浅析上传头像示例及其注意事项
高端网站建设与定制开发一站式解决方案 中企动力
建站之星价格显示格式升级,你的预算足够吗?
如何快速搭建支持数据库操作的智能建站平台?
如何注册花生壳免费域名并搭建个人网站?
如何高效利用亚马逊云主机搭建企业网站?
如何解决VPS建站LNMP环境配置常见问题?
大连 网站制作,大连天途有线官网?
网站制作的方法有哪些,如何将自己制作的网站发布到网上?
导航网站建站方案与优化指南:一站式高效搭建技巧解析
C++中引用和指针有什么区别?(代码说明)
如何通过FTP服务器快速搭建网站?
制作网站的基本流程,设计网站的软件是什么?
如何用免费手机建站系统零基础打造专业网站?
网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?
如何通过网站建站时间优化SEO与用户体验?
网站制作服务平台,有什么网站可以发布本地服务信息?
如何规划企业建站流程的关键步骤?
建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略
建站为何优先选择香港服务器?
javascript基本数据类型及类型检测常用方法小结
如何获取PHP WAP自助建站系统源码?
建站主机选哪种环境更利于SEO优化?
齐河建站公司:营销型网站建设与SEO优化双核驱动策略
Python多线程使用规范_线程安全解析【教程】
高端企业智能建站程序:SEO优化与响应式模板定制开发
如何通过虚拟主机快速搭建个人网站?
如何挑选高效建站主机与优质域名?
如何在阿里云服务器自主搭建网站?
独立制作一个网站多少钱,建立网站需要花多少钱?
济南网站制作的价格,历城一职专官方网站?
如何用wdcp快速搭建高效网站?
为什么Go需要go mod文件_Go go mod文件作用说明
网站制作公司排行榜,抖音怎样做个人官方网站
企业网站制作费用多少,企业网站空间一般需要多大,费用是多少?
如何确保FTP站点访问权限与数据传输安全?
定制建站平台哪家好?企业官网搭建与快速建站方案推荐
岳西云建站教程与模板下载_一站式快速建站系统操作指南
C#怎么创建控制台应用 C# Console App项目创建方法
已有域名如何快速搭建专属网站?
网站制作费用多少钱,一个网站的运营,需要哪些费用?
建站之星如何快速生成多端适配网站?
如何在橙子建站上传落地页?操作指南详解
宝华建站服务条款解析:五站合一功能与SEO优化设置指南
制作网站公司那家好,网络公司是做什么的?
深圳网站制作费用多少钱,读秀,深圳文献港这样的网站很多只提供网上试读,但有些人只要提供试读的文章就能全篇下载,这个是怎么弄的?
建站主机是什么?如何选择适合的建站主机?
如何用狗爹虚拟主机快速搭建网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。