PHP中的Trait 特性及作用
php  /  管理员 发布于 7年前   144
自 PHP 5.4.0 起,PHP 实现了代码复用的一个方法,称为 traits。 Traits 是一种为类似 PHP 的单继承语言而准备的代码复用机制。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用方法集。Traits 和类组合的语义是定义了一种方式来减少复杂性,避免传统多继承和混入类(Mixin)相关的典型问题。 Trait 和一个类相似,但仅仅旨在用细粒度和一致的方式来组合功能。Trait 不能通过它自身来实例化。它为传统继承增加了水平特性的组合;也就是说,应用类的成员不需要继承。 Trait是在PHP5.4中加入的,它既不是接口也不是类。主要是为了解决单继承语言的限制。是PHP多重继承的一种解决方案。例如,需要同时继承两个 Abstract Class, 这将会是件很麻烦的事情,Trait 就是为了解决这个问题。它能被加入到一个或多个已经存在的类中。它声明了类能做什么(表明了其接口特性),同时也包含了具体实现(表明了其类特性) 简单使用 首先,当然是声明个 Trait,PHP5.4 增加了 trait 关键字 同时,如果要在 Class 中使用该 Trait,那么使用 use 关键字 使用多个 Trait 在同个 Class 中可以使用多个 Trait Trait 之间的嵌套 同时,Trait 之间也可以相互的嵌套,例如 Trait 的抽象方法(Abstract Method) 我们可以在 Trait 中声明需要实现的抽象方法,这样能使使用它的 Class 必须实现它 Trait 冲突 多个 Trait 之间同时使用难免会冲突,这需要我们去解决。PHP5.4 从语法方面带入了相关 的关键字语法:insteadof 以及 as ,用法参见 上面就是些 Trait 比较基本的使用了,更详细的可以参考官方手册。这里总结下注意的几 点: Trait 会覆盖调用类继承的父类方法 Trait 无法如 Class 一样使用 new 实例化 单个 Trait 可由多个 Trait 组成 在单个 Class 中,可以使用多个 Trait Trait 支持修饰词(modifiers),例如 final、static、abstract 我们能使用 insteadof 以及 as 操作符解决 Trait 之间的冲突trait first_trait {function first_method() { /* Code Here */ }function second_method() { /* Code Here */ }}
class first_class {// 注意这行,声明使用 first_traituse first_trait;}$obj = new first_class();// Executing the method from trait$obj->first_method(); // valid$obj->second_method(); // valid
trait first_trait{function first_method() { echo "method"; }}trait second_trait {function second_method() { echo "method"; }}class first_class {// now using more than one traituse first_trait, second_trait;}$obj= new first_class();// Valid$obj->first_method(); // Print : method// Valid$obj->second_method(); // Print : method
trait first_trait {function first_method() { echo "method"; }}trait second_trait {use first_trait;function second_method() { echo "method"; }}class first_class {// now using use second_trait;}$obj= new first_class();// Valid$obj->first_method(); // Print : method// Valid$obj->second_method(); // Print : method
trait first_trait {function first_method() { echo "method"; }// 这里可以加入修饰符,说明调用类必须实现它abstract public function second_method();}class first_method {use first_trait;function second_method() {/* Code Here */}}
trait first_trait {function first_function() { echo "From First Trait";}}trait second_trait {// 这里的名称和 first_trait 一样,会有冲突function first_function() { echo "From Second Trait";}}class first_class {use first_trait, second_trait {// 在这里声明使用 first_trait 的 first_function 替换// second_trait 中声明的first_trait::first_function insteadof second_trait;}} $obj = new first_class();// Output: From First Trait$obj->first_function();
您可能感兴趣的文章:
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号