ThinkPHP 您现在的位置是:首页 > 开发笔记 > ThinkPHP
Trait和软删除
来源:惠达浪原创 发布时间:2019-05-21 最后更新:2019-05-21 8040已围观
摘要前不久,使用ThinkPHP 5.1中的软删除时,发现并不是太好用,于是对软删除做了进一步的研究,总结出一些经验和技巧,在这里记录一下。在技巧中,关于trait的应用引起了我的注意。
翻篇了,新问题出来了,怎么才能学会数学老师的技能呢?其实很简单,就是引入的时候,多加一个呗。
class Child extends Father { use ChineseTeacher, MathTeacher; }
引用多个trait,用半角“,”分开即可。这不是问题的关键,关键是,这样引进来两个老师,听谁的呢?运行一下看看吧:
完了!直接干报废了!这是啥?这是致命错误,说是trait方法work没有运行,因为根据其它trait方法冲突了。那怎么办呢?都是老师,到底听谁的得你说了算,系统肯定不知道了,所以需要手工指定,如果发生冲突,以谁为准。
class Child extends Father { use ChineseTeacher, MathTeacher { MathTeacher::work insteadof ChineseTeacher; } } // 数学老师教我乘法口诀!
注意这个写法,使用了 insteadof 关键字,指明以前边的方法为主。不要怀疑,你没看错,明明work不是静态方法,可这里还是用了 :: ,而且还没有(),别问我,我也不知道,PHP就这么规定的。
那么这时候,问题来了,既然use了语文老师,就是还希望写个论文嘛,怎么才能使用语文老师的技能呢?答案是:使用别名。
class Child extends Father { use ChineseTeacher, MathTeacher { MathTeacher::work insteadof ChineseTeacher; ChineseTeacher::work as chineseWork; } }
在调用的时候,就可以使用这个别名了:
$mySelf = new Child(); echo $mySelf->work(); echo $mySelf->chineseWork(); // 数学老师教我乘法口诀!语文老师教我写论文!
细心的朋友可能发现了,既然都 as 了,能不能省略掉 insteadof 呢?答案是:不行!as 只是起个别名,又不是把冲突解决了。不过在没有冲突的时候,倒是可以用来给方法改个名用。
class Child extends Father { use ChineseTeacher { ChineseTeacher::work as chineseWork; // 甚至还能改变访问控制 // ChineseTeacher::work as private chineseWork; } }
关于 Trait 的知识,当然不只这些,但更多的已经是具体使用细节了,比如一个 trait 引用另一个 trait、静态成员、抽象成员以及属性定义与冲突等等吧,就不在这儿啰嗦了,因为你真的到了需要了解这些知识的程序,那还不去查手册?
很赞哦! (537)
点击 排行
站点信息
- 网站平台:ThinkCMF 5.1.5
- PHP版本:7.3.31
- QQ交流群: 惠达浪技术交流