浅谈 PHP 中的 Trait 使用方法,报错如何解决

概述#

在 PHP 中有一种代码复用的技术,因为单继承的问题,有些公共方法无法在父类中写出,而 Trait 可以应对这种情况,它可以定义一些复用的方法,然后在你需要使用的类中将其引入即可.

刚开始的时候给我的感觉就是将 trait 代码块直接拿到类中的意思,但后来我发现,我太天真了.

Trait 的定义:#

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

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

PHP 中的 Trait 用法:#

Laravel

问题#

当我第一次使用的时候,因为之前一直使用抽象类,或者定义内部对象,然后调用内部对象中的方法,所以我当时有了以下几个问题:

1. 能否引入多个,如果可以的话,同名方法如何处理

2. 引入方法与现有方法重名时,如何解决

3. 能否定义抽象方法,因为有些方法需要知道使用时的情况,在抽象类中,这种情况一般通过调用抽象方法来解决

4. 能否定义字段

5. 能否将字段或方法定义为静态

6. 能否对方法进行权限控制

答疑#

  1. Trait 可以引入多个,多个 trait 中存在同名方法时,需要指定使用哪个方法,如下:

Laravel

2. 引入方法与现有方法重名时,会优先调用类中已定义的方法,其优先级顺序为:当前类方法 > trait 方法 > 父类方法

  1. trait 中可以定义抽象方法,语法与抽象类相同

Laravel

4.trait 中可以定义字段,语法与类相同

Laravel

  1. 可以定义静态方法与静态字段

Laravel

  1. 可以进行方法权限的控制

Laravel

  1. 另外,在 trait 代码块中还可以引入其他 trait 代码块,语法与类中引入相同:

Laravel

总结#

至此,我发现了一个新的问题,这个 trait 与抽象类有什么区别?说什么代码复用,这不就是多继承么?trait 与抽象类功能上有区别么?抽象类能干的,trait 都能干啊.

思前想后,我觉得区别还是有的,虽然说他们两个看着很像,功能相似,但是正如抽象类与接口一样 (虽然这两者不同,接口不能定义方法), 接口更侧重于定义一组公共的方法,一种规范,而抽象类则侧重于将子类中公共的方法进行抽离,提高代码的复用.

trait 与抽象类的侧重点也不相同

trait 侧重于定义共用的代码片段,它并不管引用此片段的类是干什么的,只要你需要,就可以拿走去用,简单说就是 trait 并不约束类的类型,而仅仅定义方法

抽象类则不同,既然你继承我,那你干的事情肯定跟我是一样的,不能抽象类是去与数据库交互的,你子类去写脚本了。所以抽象类相对 trait 更侧重于 类型的约束.

原文链接

本作品采用《CC 协议》,转载必须注明作者和本文链接
嗨,我是波波。曾经创业,有收获也有损失。我积累了丰富教学与编程经验,期待和你互动和进步! 公众号:上海 PHP 自学中心
wangchunbo
司机 @ 某医疗行业
文章
308
粉丝
352
喜欢
565
收藏
1131
排名:61
访问:12.6 万
私信
所有博文
社区赞助商