相对于多继承语言(如C++),代码复用这个问题对于单继承类语言(如Ruby、PHP等)来说需要通过其他方法来解决,例如Ruby中通过混入类(Mixin)的方法来解决。PHP自5.4.0起,使用了一种简洁的方案来实现代码复用,即trait。一个trait和一个类相似,但trait不能像类一样进行实例化,而是通过关键字use添加到其他类的内部,从而发挥它的作用。相对于传统继承方法,trait增加了水平特性的组合。下面介绍一个具体实例。
image为了在一个实例中介绍更多关于trait的性质,上面的实例相对来说有些复杂。根据上面的实例,下面列出一些trait的重要性质。
(1)优先级:当前类的方法会覆盖trait中的方法,而trait中的方法会覆盖基类的方法。
(2)多个trait组合:通过逗号分隔,通过use关键字列出多个trait。
(3)冲突的解决:如果两个trait都插入了一个同名的方法,若没有明确解决冲突将会产生一个致命错误。为了解决多个trait在同一个类中的命名冲突,需要使用insteadof操作符来明确指定使用冲突方法中的哪一个。同时,可以通过as操作符将其中一个冲突的方法以另一个名称来引入。
(4)修改方法的访问控制:使用as语法可以用来调整方法的访问控制。
(5)trait的抽象方法:在trait中可以使用抽象成员,使得类中必须实现这个抽象方法。
(6)trait的静态成员:在trait中可以用静态方法和静态变量。
(7)trait的属性定义:在trait中同样可以定义属性。
在Laravel框架中很多地方也应用到了trait,下面是身份认证中的部分代码
image在文件“AuthenticatesUsers.php”和“RegistersUsers.php”中通过trait形式分别定义了登录认证和注册的相关函数,在文件“AuthenticatesAndRegistersUsers.php”中通过trait组合方式得到登录认证和注册的组合,最后在身份控制文件“AuthController.php”中使用了这个trait,如果系统有多个登录注册模块,可以重复使用这些trait,进而达到代码复用的目的。
https://baijiahao.baidu.com/s?id=1574354687678929&wfr=spider&for=pc
网友评论