文档章节

PHP 代码复用trait

自我修炼
 自我修炼
发布于 2017/02/09 21:00
字数 884
阅读 13
收藏 0

自PHP 5.4.0起,PHP实现了一种代码服用的方法,称为trait。

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

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

通过PHP文档的定义和解释,我们可以理解为 trait 是某个class 的一部分,它可以和任意class合并,但 trait 不能实例化,同时也不能被其它类继承;trait 本质上与class没有任何的关系,当某个class引用trait时,才会与当前class合并。

实例如下:

<?php trait SayWorld { public function sayHello(){ echo 'world'; } } class MyHelloWorld { //引入trait SayWorld 与 MyHelloWorld类合并 use SayWorld; } //实例化类 $hello = new MyHelloWorld; //输出 world $hello->sayHello();

需要注意的有以下几点:

  1. 优先级
    如果当前类中的方法名称与引入的trait 中的方法相同时,则当前类中的方法会覆盖trait 中的方法;如果当前类继承某个基类,而基类中的方法名称与trait 中的方法名称相同时,则引入的trait 中的方法会覆盖基类中的方法。

如下所示:

<?php trait HelloWorld { public function sayHello() { echo 'Hello World!'; } } class TheWorldIsNotEnough { //引入HelloWorld与当前类TheWorldIsNotEnough合并 use HelloWorld; //因为当前类与引入的HelloWorld中的方法重名, //所以当前类TheWorldIsNotEnough中的方法覆盖了HelloWorld中的方法sayHello public function sayHello() { echo 'Hello Universe!'; } } $o = new TheWorldIsNotEnough(); //输出 Hello Universe! $o->sayHello(); ?>
  1. 冲突的解决

如果两个trait都插入了一个同名的方法,如果没有明确解决冲突将会产生一个致命错误。

当多个trait 在同一个类中引入,且存在方法名称重复时,则需要使用insteadof操作符来明确指定重名方法是属于那个trait的;
还可以使用as操作符将其中一个方法重命名。

如下代码:

<?php trait A { public function smallTalk() { echo 'a'; } public function bigTalk() { echo 'A'; } } trait B { public function smallTalk() { echo 'b'; } public function bigTalk() { echo 'B'; } } class Talker { //引入多个trait时,可以用逗号分割 use A, B { //指定重名的方法分别属于那个trait B::smallTalk insteadof A; A::bigTalk insteadof B; } } class Aliased_Talker { use A, B { //指定重名的方法分别属于那个trait B::smallTalk insteadof A; A::bigTalk insteadof B; //用as 操作符重命名trait中的重复方法 B::bigTalk as talk; } } ?>
  1. 修改方法的访问控制
    使用as操作符可以修改trait中方法的访问控制。
    如下所示:
<?php trait HelloWorld { public function sayHello() { echo 'Hello World!'; } } class MyClass1 { //修改 sayHello 的访问控制 use HelloWorld { sayHello as protected; } } // 给方法一个改变了访问控制的别名 // 原版 sayHello 的访问控制则没有发生变化 class MyClass2 { use HelloWorld { sayHello as private myPrivateHello; } } ?>

对于在类中引入trait的其他操作访问,都与操作与同一个类中的方法、属性等相同。

注:trait 就相当于某一个class或者trait的一部分,在class与trait中引入某个trait时,会和当前引入的class或trait进行合并。

© 著作权归作者所有

共有 人打赏支持
自我修炼
粉丝 0
博文 9
码字总数 11400
作品 0
昆明
项目经理
私信 提问
php trait 简明教程,多重继承的实现方案

http://php.net/manual/en/language.oop5.traits.php 自PHP5.4.0起,PHP实现了代码复用的一个方法,称为traints。 Traits是一种为类似PHP的单继承语音而准备的代码复用机制。Trait为了减少单...

雪之丞
2016/03/28
53
0
TODO:Laravel 内置简单登录

TODO:Laravel 内置简单登录 激活Laravel的Auth系统Laravel 利用 PHP 的新特性 trait 内置了非常完善好用的简单用户登录注册功能,适合一些不需要复杂用户权限管理的系统,例如公司内部用的简...

OneTODO
2016/12/20
13
0
PHP traits (复用机制)

最近在学习Laravel中,遇到了很多关于Traits ,查了下资料,分享下。 提到 php 的代码复用,我们可能第一时间会想到继承,但是这种单继承语言一旦派生的子类过多,那么会产生一系列的问题,比...

Coding_ff
2017/05/27
0
0
php trait特性详解及使用注意事项

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/HobHunter/article/details/80721260 php trait特性 简介 自 PHP 5.4.0 起,PHP 实现了一种代码复用的方法,称...

库塔姆斯
2018/06/17
0
0
PHP之新手自学基础知识(五)——拓展篇之魔术变量及魔术函数

PHP 魔术变量 魔术变量就是指那些根据不同环境有不同的取值,以下介绍的是魔术常量,由于在不同环境有不同的取值所以也叫魔术变量。知道本质是个常量就好了。 PHP 向它运行的任何脚本提供了大...

天谴残魂
2018/01/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周一乱弹 —— 白掌柜说了卖货不卖身

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @爱漫爱 :这是一场修行分享羽肿的单曲《Moony》 手机党少年们想听歌,请使劲儿戳(这里) @clouddyy :开不开心? 开心呀, 我又不爱睡懒觉…...

小小编辑
今天
8
0
大数据教程(11.7)hadoop2.9.1平台上仓库工具hive1.2.2搭建

上一篇文章介绍了hive2.3.4的搭建,然而这个版本已经不能稳定的支持mapreduce程序。本篇博主将分享hive1.2.2工具搭建全过程。先说明:本节就直接在上一节的hadoop环境中搭建了! 一、下载apa...

em_aaron
今天
2
0
开始看《JSP&Servlet学习笔记》

1:WEB应用简介。其中1.2.1对Web容器的工作流程写得不错 2:编写Servlet。搞清楚了Java的Web目录结构,以及Web.xml的一些配置作用。特别是讲了@WebServlet标签 3:请求与响应。更细致的讲了从...

max佩恩
今天
4
0
mysql分区功能详细介绍,以及实例

一,什么是数据库分区 前段时间写过一篇关于mysql分表的的文章,下面来说一下什么是数据库分区,以mysql为例。mysql数据库中的数据是以文件的形势存在磁盘上的,默认放在/mysql/data下面(可...

吴伟祥
今天
3
0
SQL语句查询

1.1 排序 通过order by语句,可以将查询出的结果进行排序。放置在select语句的最后。 格式: SELECT * FROM 表名 ORDER BY 排序字段ASC|DESC; ASC 升序 (默认) DESC 降序 1.查询所有商品信息,...

stars永恒
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部