全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

关于 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框架模型中非静态方法也能静态调用的原理分析  # 绑定  # 都是  # 是一个  # 后期  # 是在  # 有个  # 抽象类  # 可以用  # 这也  # 这两个  # 这个时候  # 重写  # 报错  # 解决办法  # 中说  # 大家多多  # 弗兰克  # 如图所示  # 改变了  # 就是在 


相关文章: 如何快速搭建高效简练网站?  宝塔面板如何快速创建新站点?  Android自定义listview布局实现上拉加载下拉刷新功能  建站主机服务器选型指南与性能优化方案解析  详解jQuery中基本的动画方法  如何快速完成中国万网建站详细流程?  成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?  ,想在网上投简历,哪几个网站比较好?  自助网站制作软件,个人如何自助建网站?  微信小程序 input输入框控件详解及实例(多种示例)  历史网站制作软件,华为如何找回被删除的网站?  清单制作人网站有哪些,近日“兴风作浪的姑奶奶”引起很多人的关注这是什么事情?  如何选择网络建站服务器?高效建站必看指南  网站设计制作公司地址,网站建设比较好的公司都有哪些?  建站之星伪静态规则如何设置?  香港服务器部署网站为何提示未备案?  制作国外网站的软件,国外有哪些比较优质的网站推荐?  Swift开发中switch语句值绑定模式  免费制作海报的网站,哪位做平面的朋友告诉我用什么软件做海报比较好?ps还是cd还是ai这几个软件我都会些我是做网页的?  jQuery 常见小例汇总  制作销售网站教学视频,销售网站有哪些?  Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解  如何用PHP工具快速搭建高效网站?  如何通过西部建站助手安装IIS服务器?  宝塔建站教程:一键部署配置流程与SEO优化实战指南  建站之星2.7模板:企业网站建设与h5定制设计专题  Android自定义控件实现温度旋转按钮效果  网站专业制作公司有哪些,做一个公司网站要多少钱?  建站之星×万网:智能建站系统+自助建站平台一键生成  如何快速搭建高效可靠的建站解决方案?  ,怎么在广州志愿者网站注册?  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  如何通过wdcp面板快速创建网站?  高端企业智能建站程序:SEO优化与响应式模板定制开发  网站制作培训多少钱一个月,网站优化seo培训课程有哪些?  北京营销型网站制作公司,可以用python做一个营销推广网站吗?  javascript中对象的定义、使用以及对象和原型链操作小结  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  网页设计与网站制作内容,怎样注册网站?  建站之星安装后如何自定义网站颜色与字体?  整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?  动图在线制作网站有哪些,滑动动图图集怎么做?  网站企业制作流程,用什么语言做企业网站比较好?  宝塔新建站点为何无法访问?如何排查?  怎么将XML数据可视化 D3.js加载XML  建站之星安装失败:服务器环境不兼容?  建站之星在线版空间:自助建站+智能模板一键生成方案  如何处理“XML格式不正确”错误 常见XML well-formed问题解决方法  建站中国官网:模板定制+SEO优化+建站流程一站式指南  建站主机服务器选购指南:轻量应用与VPS配置解析 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。