首页 » PHP » PHP 中 trait 的使用

PHP 中 trait 的使用

 

半年没写博客了,现在有时间了,重新开张。

trait 是 PHP 5.4 新增的一个特性,一种代码复用的方法。官方解释如下:

Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用 method。Trait 和 Class 组合的语义定义了一种减少复杂性的方式,避免传统多继承和 Mixin 类相关典型问题。

Trait 和 Class 相似,但仅仅旨在用细粒度和一致的方式来组合功能。 无法通过 trait 自身来实例化。它为传统继承增加了水平特性的组合;也就是说,应用的几个 Class 之间不需要继承。

举个例子,有 MiddleSchool 和 SedanCar两个 PHP 类,它们的作用十分不同,而且在继承层次结构中没有共同的父类。但是这两个类都应该能使用地理编码技术转换成经纬度在地图上显示,为了解决这个问题,可以创建一个父类 Geocodable,让 MiddleSchool 和 SedanCar 都继承这个父类,但是这么做不好,因为这两个类的作用不同,这个时候就可以用 trait 了。

创建一个 Geocodable 的 trait,实现地理编码相关的方法,然后在 MiddleSchool 和 SedanCar 两个类里 use 这个 trait,这么做不会影响这两个类的继承层次结构,还可以很清楚的看到这两个类有转换地理编码特性。

下面说明 trait 的用法。

trait 的定义:

trait 的使用:

trait 的优先级高于父类,如果有相同的方法,trait 会覆盖父类的方法。

多个trait的引用可以通过逗号分隔,在 use 声明列出多个 trait,可以都插入到一个类中。但是引入多个 trait 时,如果有两个里面有同名方法,没有明确解决冲突时将会产生一个致命错误。

为了解决多个 trait 在同一个类中的命名冲突,需要使用 insteadof 操作符来明确指定使用冲突方法中的哪一个。

insteadof 操作符仅允许排除掉其它方法,as 操作符可以为某个方法引入别名。 注意,as 操作符不会对方法进行重命名,也不会影响其方法。

trait 的其他特性(如修改方法的访问控制、从 trait 来组成 trait等)请查看官方文档,这里不做说明。

 

PS:

trait 中的 use 和命名空间的 use 的区别在于,trait 的 use 在类中使用,命名空间在类外面使用。

 

参考文档:

《Model PHP (中文版)》 第2章 性状

PHP官方文档 http://php.net/manual/zh/language.oop5.traits.php

原文链接:PHP 中 trait 的使用,转载请注明来源!

1