关于Laravel中的后期静态绑定
关于PHP新的静态延迟静态绑定,或者说延迟静态绑定,Laravel有一个问题。如下,在Laravel中调用Model添加数据时,首先在Model中添加一个获取子表的方法:
受保护函数addToMessage($msgType,$userID,$ commentID,$replyCommentID,$replyUserID,$gameID){ if(!$userID) {返回false} $table='t_message_ '。哈希德(用户标识,100美元);$ this-message-setable($ table)-create([' msg _ type '=$ msgType,' user_id'=$userID,' comment _ id '=$ commentID,' reply _ comment id ',' reply_user_id'=$replyUserID,' game_id'=$gameID,' is_read'=0,' created _ at '=date(' Y-m-d h 3360 I 3360s '),]);返回真;}这里,可设置方法是在Model中定义的获取子表的方法:
public function SETable($ table){ $ this-table=$ table;返回$ this}从错误日志中发现$this-table无效,但实际上,在调用create方法之前打印表名时,它是预期值。为什么在这里调用create方法时没有重置$this-table?
这里,$this-message是一个继承模型类的模型类,其中create方法:
公共静态函数create(array $ attributes=[]){ $ model=new static($ attributes);$ model-save();return $模型;}位于供应商\ laravel \ framework \ src \ light \ database \ eloquet \ model . phpline 557中.
由于Laravel框架的Model类是抽象类型,在new static后期可以用静态绑定的方式实例化PHP中的抽象类,而create方法中的$Model=new static($attributes)实际上是重新实例化返回的,但是调用者的Model类没有定义table属性,所以$this-table此时没有值。
解决方法是使用save方法,如图所示。实际上,create方法也调用save方法。
实验
带有创建方法的抽象类A通过延迟静态绑定来实例化和返回。类b继承了在方法a和测试中修改的父类的name属性。
?php抽象类A { protected $ name=' tanteng公共静态函数create(){ return new static();} }类扩展了{//protected $ name='纸牌屋frank ';公共函数测试(){ $ this-name=' Tony Tan ';返回$ this}} $obj1=(新B)-test();$obj2=(新B)-test()-create();var _ dump($ obj 1);var _ dump($ obj 2);结果显示$obj1和$obj2都是b的实例,并且测试方法的属性名已经更改,但是在调用create方法后属性名没有更改。这是本文中拉瓦雷遇到的场景。(这里,如果打开了注释,打印的名称就是重写的值)
如果抽象类A变成普通类,新的静态变成新的自我,结果就不一样了。打印的属性名称是每个类的属性。
参考链接
PHP:后期静态绑定
PHP中新自我()和新静态()的区别
以上就是本文的全部内容。希望对大家的学习有帮助,支持我们。
版权声明:关于Laravel中的后期静态绑定是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。