资讯专栏INFORMATION COLUMN

萧峰与郭靖教你学会PHP的Trait

keke / 3418人阅读

摘要:的使用场景如以下应用场景我是人,我能吃饭降龙十八掌降龙十八掌类与类都继承于,都有共同的方法,显然,我们不能将这个方法写到类,不然随便一个路人甲继承了类,就拥有了技能。

在PHP5.4之前,PHP面向对象需要复用代码的方式是使用类的继承。但PHP只支持单继承,在应对较复杂的业务逻辑中,单继承就显得捉襟见肘了。

trait的使用场景

如以下应用场景:

class Person {
    public function eat() {
        echo "我是人,我能吃饭
"; } } class GuoJing extends Person { public function kungfu() { echo "降龙十八掌!
"; } } class XiaoFeng extends Person { public function kungfu() { echo "降龙十八掌!
"; } }

Guojing 类 与 XiaoFeng 类都继承于Person,都有共同的 Kungfu 方法,显然,我们不能将这个 Kungfu 方法写到 Person 类,不然随便一个路人甲继承了 Person 类,就拥有了 Kungfu 技能。

用Trait就能解决此问题:

";
    }
}

class Person {
    public function eat() {
        echo "我是人,我能吃饭
"; } } class GuoJing extends Person { use Tool; } class XiaoFeng extends Person { use Tool; } $guojing = new GuoJing(); $xiaofeng = new XiaoFeng(); $guojing->kungfu(); $xiaofeng->kungfu();

结果如下:

降龙十八掌!
降龙十八掌!
方法/属性的重写

如果Trait类、基类和本类中的方法或属性同名,最终会以哪个为准?

";
    }
}

class Person {
    public function eat() {
        echo "我是人,我能吃饭
"; } public function kungfu() { echo "不是每个人都会功夫
"; } } class GuoJing extends Person { use Tool; public function kungfu() { echo "除了降龙十八掌,我还懂九阴真经!
"; } } class XiaoFeng extends Person { use Tool; } $guojing = new GuoJing(); $guojing->kungfu();

结果:

除了降龙十八掌,我还懂九阴真经!

注释本类的 kungfu 方法,得出的结果是:

降龙十八掌!

当方法或属性同名时,当前类中的方法会覆盖 trait的 方法,而 trait 的方法又覆盖了基类中的方法。

组合多个trait

多个trait有同名的方法/属性时,会报错:

";
    }
}

trait Skill {
    public function kungfu() {
        echo "浑厚的内力修为
"; } } class GuoJing { use Tool, Skill; } $guojing = new GuoJing(); $guojing->kungfu();
Fatal error: Trait method kungfu has not been applied, because there are collisions with other trait methods on GuoJing 

解决方式:使用insteadof和as来解决冲突

insteadof: 使用某个方法替代另一个

as: 给方法取别名

";
    }
}

trait Skill {
    public function kungfu() {
        echo "浑厚的内力修为
"; } } class XiaoFeng { use Tool, Skill { Skill::kungfu insteadof Tool; Skill::kungfu as ability; } } $xiaofeng = new XiaoFeng(); $xiaofeng->ability();
浑厚的内力修为
trait方法的访问控制

as关键词可以修改方法的访问控制

";
    }
}

class XiaoFeng {
    use Tool {
        Tool::kungfu as protected ability; // 修改方法的访问控制并起别名
    }
}

$xiaofeng = new XiaoFeng();
$xiaofeng->ability();

报错:

Fatal error: Uncaught Error: Call to protected method XiaoFeng::ability() from context
Trait组合

Trait也能组合Trait,同时,Trait中支持抽象方法、静态属性、静态方法。

";
    }
}

trait Feature{
    use Tool;
    abstract public function dream();
    public static function character() {
        echo "磊落豪雄 
"; } } class XiaoFeng { use Feature; public function dream() { echo "弄清楚:我是谁?
"; } } $xiaofeng = new XiaoFeng(); $xiaofeng->kungfu(); XiaoFeng::character(); $xiaofeng->dream();

结果:

降龙十八掌!
磊落豪雄 
弄清楚:我是谁? 
源码下载

源码仓库链接

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/23291.html

相关文章

  • 金庸武侠世界和SAP江湖

    摘要:年月日晚,成都地铁一号线,手机上突然弹出来一条金庸去世的新闻。作为一个开发人员,我在金庸这十四部名著里看到的,是的江湖。金庸的这个武功设定,和公司的数字化转型,向的转型很像。 2018年10月30日晚,成都地铁一号线,Jerry手机app上突然弹出来一条金庸去世的新闻。 Jerry识字很早,小学一年级就开始蹭我父亲的《射雕英雄传》看了。小时候,我爸工作的车间里有一位领导,退休后把自己家...

    Blackjun 评论0 收藏0
  • 教你用认知和人性来做最棒程序员

    摘要:不久前,在团队内部和大家做了一次分享,内容就是这次要讲的用认知和人性来提升自己的技术水平,大家反响不错,所以这次整理一下也分享给大家。 不久前,在团队内部和大家做了一次分享,内容就是这次要讲的用认知和人性来提升自己的技术水平,大家反响不错,所以这次整理一下也分享给大家。最初我是想用借优秀的产品经理思维来做最棒程序员的这个标题,但想想还是要有同理心,技术同学平时和产品同学已经是相爱相杀了...

    Scliang 评论0 收藏0
  • 教你用认知和人性来做最棒程序员

    摘要:不久前,在团队内部和大家做了一次分享,内容就是这次要讲的用认知和人性来提升自己的技术水平,大家反响不错,所以这次整理一下也分享给大家。 不久前,在团队内部和大家做了一次分享,内容就是这次要讲的用认知和人性来提升自己的技术水平,大家反响不错,所以这次整理一下也分享给大家。最初我是想用借优秀的产品经理思维来做最棒程序员的这个标题,但想想还是要有同理心,技术同学平时和产品同学已经是相爱相杀了...

    Kosmos 评论0 收藏0
  • PHP 特性之 trait (一)

    摘要:在阅读文档的时候看到一个类是以声明的。是一种代码复用技术,为的单继承限制提供了一套灵活的代码复用机制。下面把的代码做一个修改以上代码会输出。可以看出优先级的顺序为,当前类的优先级基类。   在阅读laravel文档的时候看到一个类 是以 Trait声明的。平时在工作中从来没有用过,于是就去看了下官方文档。原来这个类早在php5.4.0就有了。可惜在项目中从来没有用过。   Trait看...

    ermaoL 评论0 收藏0
  • 关于PHPTrait特性

    摘要:关于作者程序开发人员,不拘泥于语言与技术,目前主要从事和前端开发,使用和,端使用混合式开发。和组合的语义定义了一种减少复杂性的方式,避免传统多继承和类相关典型问题。它为传统继承增加了水平特性的组合也就是说,应用的几个之间不需要继承。 关于作者 程序开发人员,不拘泥于语言与技术,目前主要从事PHP和前端开发,使用Laravel和VueJs,App端使用Apicloud混合式开发。合适和...

    wind3110991 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<