【转】PHP的Trait 特性
Trait是在PHP5.4中加入的,它既不是接口也不是类。主要是为了解决单继承语言的限制。是PHP多重继承的一种解决方案。例如,需要同时继承两个 Abstract Class, 这将会是件很麻烦的事情,Trait 就是为了解决这个问题。它能被加入到一个或多个已经存在的类中。它声明了类能做什么(表明了其接口特性),同时也包含了具体实现(表明了其类特性)
简单使用
首先,当然是声明个 Trait,PHP5.4 增加了 trait 关键字
1 trait first_trait { 2 function first_method() { /* Code Here */ } 3 function second_method() { /* Code Here */ } 4 }
同时,如果要在 Class 中使用该 Trait,那么使用 use 关键字
1 class first_class { 2 // 注意这行,声明使用 first_trait 3 use first_trait; 4 } 5 6 $obj = new first_class(); 7 8 // Executing the method from trait 9 $obj->first_method(); // valid 10 $obj->second_method(); // valid
使用多个 Trait
在同个 Class 中可以使用多个 Trait
1 trait first_trait 2 { 3 function first_method() { echo "method1"; } 4 } 5 6 trait second_trait { 7 function second_method() { echo "method2"; } 8 } 9 10 class first_class { 11 // now using more than one trait 12 use first_trait, second_trait; 13 } 14 15 $obj= new first_class(); 16 17 // Valid 18 $obj->first_method(); // Print : method1 19 20 // Valid 21 $obj->second_method(); // Print : method2
Trait 之间的嵌套
同时,Trait 之间也可以相互的嵌套,例如
1 trait first_trait { 2 function first_method() { echo "method1"; } 3 } 4 5 trait second_trait { 6 use first_trait; 7 function second_method() { echo "method2"; } 8 } 9 10 class first_class { 11 // now using 12 use second_trait; 13 } 14 15 $obj= new first_class(); 16 17 // Valid 18 $obj->first_method(); // Print : method1 19 20 // Valid 21 $obj->second_method(); // Print : method2
Trait 的抽象方法(Abstract Method)
我们可以在 Trait 中声明需要实现的抽象方法,这样能使使用它的 Class 必须实现它
1 trait first_trait { 2 function first_method() { echo "method1"; } 3 4 // 这里可以加入修饰符,说明调用类必须实现它 5 abstract public function second_method(); 6 } 7 8 class first_method { 9 use first_trait; 10 11 function second_method() { 12 /* Code Here */ 13 } 14 }
Trait 冲突
多个 Trait 之间同时使用难免会冲突,这需要我们去解决。PHP5.4 从语法方面带入了相关 的关键字语法:insteadof 以及 as ,用法参见
1 trait first_trait { 2 function first_function() { 3 echo "From First Trait"; 4 } 5 } 6 7 trait second_trait { 8 // 这里的名称和 first_trait 一样,会有冲突 9 function first_function() { 10 echo "From Second Trait"; 11 } 12 } 13 14 class first_class { 15 use first_trait, second_trait { 16 // 在这里声明使用 first_trait 的 first_function 替换 17 // second_trait 中声明的 18 first_trait::first_function insteadof second_trait; 19 } 20 } 21 22 $obj = new first_class(); 23 24 // Output: From First Trait 25 $obj->first_function();
上面就是些 Trait 比较基本的使用了,更详细的可以参考官方手册。这里总结下注意的几 点:
- Trait 会覆盖调用类继承的父类方法
- Trait 无法如 Class 一样使用 new 实例化
- 单个 Trait 可由多个 Trait 组成
- 在单个 Class 中,可以使用多个 Trait
- Trait 支持修饰词(modifiers),例如 final、static、abstract
- 我们能使用 insteadof 以及 as 操作符解决 Trait 之间的冲突
转载于:https://www.cnblogs.com/zyf-zhaoyafei/p/5341223.html
【转】PHP的Trait 特性相关推荐
- PHP trait 特性
trait是PHP自5.4版本之后加入的一种新的代码复用机制,是一种细粒度代码复用的方法.官方文档对于trait给出的解释是: 自 PHP 5.4.0 起,PHP 实现了一种代码复用的方法,称为 tr ...
- 28.特性trait.rs
/* 特性(trait)概念接近于 Java 中的接口(Interface),但两者不完全相同.特性与接口相同的地方在于它们都是一种行为规范,可以用于标识哪些类有哪些方法 trait Descript ...
- Scala _07trait特性
trait 特性 概念理解 Scala Trait(特征) 相当于 Java 的接口,实际上它比接口还功能强大. 与接口不同的是,它还可以定义属性和方法的实现. 一般情况下Scala的类可以继承多个T ...
- colsure php_PHP Closure(闭包)类详解
闭包就是能够读取其他函数内部变量的函数.例如在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成"定义在一个函数内部的函数".在本质上,闭包是将函数内 ...
- 年前最后一项技能树 Rust ,攻碉堡 ing (Bilibili 视频整理)
前言 我自己的语言语言学习树 最新的新闻 最近的新闻,Rust 审核团队,集体辞职抗议, 还是linux 社区的 linus 牛皮,镇得住场子不要慌,咱们是在linux 社区混的,影响不大,该学还是得 ...
- yii2.0框架中自定义接口,实现类的多继承
一.前言 最近有个需求,比如有A,B,C,D四个文件,原来的逻辑是,A继承B,C继承D.后来由于A和C的逻辑太像,既然如此的话,为什么不把A,C写一起呢,第一是方便维护,第二也是减少无用的代码,说干就 ...
- php use as是什么意思,use关键字在PHP中的几种用法
在学习了和使用了这么多年的PHP之后,您知道use这个关键字在PHP中都有哪些用法吗?今天我们就来看一下它的三种常见用法. 1. 用于命名空间的别名引用 // 命名空间 include 'namesp ...
- pd 生成mysql 脚本_PowerDesigner 如何生成数据库更新脚本
最近在学习使用PowerDesigner 这个数据库设计工具,发现真的很强大,可以做很多事情,其中就涉及到如果数据库要进行更新了怎么办,主要是增加表,最麻烦的是修改字段名称,增加字段等操作,遇到主要的 ...
- 使用traits技术表现迭代器类型 iterator_category
1.STL的迭代器类型标识,和容器中的迭代器类型. 2.使用trait技术实现stl的advance功能. 3.迭代器trait中的其他类型定义. 1.STL的迭代器类型标识,和容器中的迭代器类型. ...
最新文章
- DZX2无法读取会员短消息
- 不属于JAVA类中的变量_在Java中,不属于整数类型变量的是( )。_学小易找答案...
- SEO优化中如何引导流量
- jvm垃圾回收器(《深入理解java虚拟机》)
- CountDownLatch闭锁
- C#中跨线程访问控件问题解决方案
- java代理通俗简单解析
- 我是一名服装公司的老板娘,年收入千万上下
- php实现弱类型,PHP内核探索:弱类型变量的实现
- 业内为啥如此恨视觉中国
- Ubuntu 使用 Cron 实现计划任务
- Linux, CentOS7 安装并打开最新版firefox浏览器
- (个人理解+转载)ANSI/ASCII/UTF8/UNICODE/GB2312/UCS-2/UTF16-文本的编码格式
- ssd的smt_SMT 工厂基础参数要求
- FPGA控制DAC8550
- python 对比matlab_全面对比 MATLAB、Julia、Python,谁在科学计算中更胜一筹?
- 胃溃疡 ---- 四药同治(丽珠得乐、奥美拉唑、阿莫西林 + 克林霉素)
- Java 自动排序map_跟我学Java编程—应用自动排序的TreeMap
- 中间件是什么?Linux常用中间件都有哪些?
- 火影专场:Redis分布式锁实战
热门文章
- php 正则替换style,php正则去除js,class,id,style标签代码
- SpringCloud Gateway的组成结构
- 收集程序员语录70则
- 十条实用的jQuery代码片段
- CSS一些实用的技巧
- python数据可视化源码_Python数据分析:基于Plotly的动态可视化绘图 随书源码[101MB]...
- 【排序】算法(python实现)
- 人脸识别及对比_没有“色彩对比可及性的神话”
- sketch钢笔工具_Sketch和Figma,不同的工具等于不同的结果
- 能在任意一种框架中复用的组件,太牛了!