Laravel 中的一个后期静态绑定

关于 %ign%ignore_a_1%re_a_1% 的 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;}

位于 vendorlaravelframeworksrcIlluminateDatabaseEloquentModel.php Line 557.

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

de090bb5c4774a9b22918dfbb569baf.png

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

实验

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

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 都是各自类的属性。

更多Laravel相关技术文章,请访问Laravel框架入门教程栏目进行学习!

以上就是Laravel 中的一个后期静态绑定的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/107983.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
《无主之地4》在Steam Deck上无法流畅运行 表现不佳!
上一篇 2025年11月22日 18:39:11
MySQL中“SELECT”语句的含义是什么以及如何使用它?
下一篇 2025年11月22日 18:41:13

相关推荐

发表回复

登录后才能评论
关注微信