再谈高级面向对象编程之traits代码复用

再谈高级面向对象编程之traits

PHP实现了代码复用的一个方法,称为traits

Traits试图用来解决在像PHP这样的面向对象语言中只支持单继承的问题。举例来说,比如我们设计了一个web站点,他有很多不同的类:用户(user),页面(page),联系表单(contactform)等。当我们在开发这个站点的时候,如果不去关心对象的类型,而可以使用一个调试工具打印出一个给定对象的信息,那将十分有用。

       Function dumpObject(){

}

我们可能需要在每个类中添加这个方法的定义,但是这样做的话就会造成不必要的代码冗余。通常情况下,当我们需要在多个不同的类中使用同一个方法的时候,继承是个不错的解决方案,然而,在PHP中,每个类只能单一的一个父类继承,这样的话就不能为多个类指定同一个比较通用的父类了。解决办法当然是有的,那就是traits。Traits允许我们在不使用继承的情况下为一个类增加功能。

要创建一个traits,需要使用trait关键字,后面跟着他的名字和定义:

Trait tSomeTrait{

       Function someFunction();

}

在习惯上,我们在trait命名的时候以小写的t开始,但是这不是必须的。

像一个抽象类或者接口一样,traits不能被初始化,也就是说我们不能从一个trait创建一个对象。然而,我们可以通过use关键字在一个类的定义中为这个类增加一个trait。

Class Someclass{

       Use tSomeTrait;

}

就像在一个PHP脚本中使用include包含一个外部的PHP脚本就能使其马上生效一样,在这里增加一个use TraitName语句就能使这个trait的代码对当前类生效。

【示例】使用traits,我们将在一个单独的脚本文件中定义trait自身,然后在另一个脚本中使用trait创建一个对象。

1.     Trait tDebug{

}

2.     开始定义方法 dumpObject();

Public function dumpObject(){

       $class = get_class($this);

}

这个方法没有任何参数,但是经常引用到$this,也就是代表着当前的对象。这个方法做的第一件事是找到对象所对应的类名。这个或许可以通过调用get_class()函数实现,这个函数将返回当前对象所对应的类的名称。

3.     获得对象的属性和方法

$attributes = get_object_vars($this);

$method = get_class_methods($this);

这里我们在这个trait中使用的另外两个新的函数。第一个函数可以获得给定对象的属性:包括属性的名称和他们的值。第二个函数用于获得相关联的类的方法。注意没有get_object_methods()函数,这也是这两个函数在命名上有些许区别的原因。

知识拓展:接口与traits

Traits看上去和接口有很多地方相似,但是二者其实有天壤之别。一个接口会强制执行更严格的编程规则,以便类被设计为实现特定的方法。相反的,一个trait使方法对一个类可用,即便他在类中没有定义。

提示:traits可以有抽象方法,但是它必须要在任何使用该traits的类中实现该方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值