ThinkPHP 您现在的位置是:首页 > 开发笔记 > ThinkPHP

Trait和软删除

来源:惠达浪原创 发布时间:2019-05-21 最后更新:2019-05-21 8040已围观

摘要前不久,使用ThinkPHP 5.1中的软删除时,发现并不是太好用,于是对软删除做了进一步的研究,总结出一些经验和技巧,在这里记录一下。在技巧中,关于trait的应用引起了我的注意。

翻篇了,新问题出来了,怎么才能学会数学老师的技能呢?其实很简单,就是引入的时候,多加一个呗。

class Child extends Father
{
    use ChineseTeacher, MathTeacher;
}

引用多个trait,用半角“,”分开即可。这不是问题的关键,关键是,这样引进来两个老师,听谁的呢?运行一下看看吧:

image.png

完了!直接干报废了!这是啥?这是致命错误,说是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交流群: 惠达浪技术交流