PHP中的traits实现代码复用使用实例


Posted in PHP onMay 13, 2015

PHP5.4后新增traits实现代码复用机制,Trait和类相似,但不能被实例化,无需继承,只需要在类中使用关键词use引入即可,可引入多个Traits,用','隔开。

(1)Trait简单使用

<?php
 
trait A {
  public $var1 = 'test1';
  public function test1() {
    echo 'trait A::test1()';
  }
}
 
trait B {
  public $var2 = 'test2';
  public function test2() {
    echo 'trait B::test2()';
  }
}
 
class C {
  use A,B;
}
 
$c = new C();
echo $c->var1; //test1
$c->test2(); //trait B::test2()

(2)优先级问题
Trait会覆盖继承的方法,当前类会覆盖Trait方法。

trait A {
  public $var1 = 'test';
  public function test() {
    echo 'A::test()';
  }
  public function test1() {
    echo 'A::test1()';
  }
}
 
class B {
  public function test() {
    echo 'B::test()';
  }
  public function test1() {
    echo 'B::test1()';
  }
}
class C extends B{
  use A;
  public function test() {
    echo 'c::test()';
  }
}
 
$c = new C();
$c->test(); //c::test()
$c->test1(); //A::test1()

(3)多个Trait冲突问题
如果没有解决冲突,会产生致命错误;
可用insteadof来明确使用冲突中哪一个方法;
可用as操作符将其中一个冲突方法另起名;

trait A {
  public function test() {
    echo 'A::test()';
  }
}
 
trait B {
  public function test() {
    echo 'B::test()';
  }
}
 
class C {
  use A,B {
    B::test insteadof A;
    B::test as t;
  }
}
 
$c = new C();
$c->test(); //B::test()
$c->t(); //B::test()  可以用as另起名

(4)as可用来修改方法访问控制

trait HelloWorld {
  public function sayHello () {
    echo 'Hello World!' ;
  }
}
 
// 修改 sayHello 的访问控制
class A {
  use HelloWorld { sayHello as protected; }
}
 
// 给方法一个改变了访问控制的别名
// 原版 sayHello 的访问控制则没有发生变化
class B {
  use HelloWorld { sayHello as private myPrivateHello ; }
}
 
$b = new A();
$b->sayHello(); //Fatal error: Call to protected method A::sayHello() from context ''

(5)Trait中使用Trait

trait A {
  public function test1() {
    echo 'test1';
  }
}
 
trait B {
  public function test2() {
    echo 'test2';
  }
}
 
trait C {
  use A,B;
}
 
class D {
  use C;
}
 
$d = new D();
$d->test2(); //test2

(6)Trait支持抽象方法、支持静态方法、不可以直接定义静态变量,但静态变量可被trait方法引用。

trait A {
  public function test1() {
    static $a = 0;
    $a++;
    echo $a;
  }
 
  abstract public function test2(); //可定义抽象方法
}
 
class B {
  use A;
  public function test2() {
 
  }
}
 
$b = new B();
$b->test1(); //1
$b->test1(); //2

(7)Trait可定义属性,但类中不能定义同样名称属性

trait A {
  public $test1;
}
 
class B {
  use A;
  public $test2;
}
PHP 相关文章推荐
一键删除顽固的空文件夹 软件下载
Jan 26 PHP
PHP调用MySQL的存储过程的实现代码
Aug 12 PHP
提高PHP编程效率 引入缓存机制提升性能
Feb 15 PHP
php生成txt文件标题及内容的方法
Jan 16 PHP
php生成图片验证码的实例讲解
Aug 03 PHP
PHP异常处理Exception类
Dec 11 PHP
PHP随机数 C扩展随机数
May 04 PHP
Yii2 rbac权限控制之rule教程详解
Jun 23 PHP
php+MySql实现登录系统与输出浏览者信息功能
Jul 01 PHP
PHP实现自动识别原编码并对字符串进行编码转换的方法
Jul 13 PHP
ThinkPHP框架分布式数据库连接方法详解
Mar 14 PHP
PHP ob缓存以及ob函数原理实例解析
Nov 13 PHP
浅谈本地WAMP环境的搭建
May 13 #PHP
PHP脚本监控Nginx 502错误并自动重启php-fpm
May 13 #PHP
简单解决新浪SAE无法上传文件的问题
May 13 #PHP
PHP file_get_contents函数读取远程数据超时的解决方法
May 13 #PHP
正确的PHP匹配UTF-8中文的正则表达式
May 13 #PHP
如何在HTML 中嵌入 PHP 代码
May 13 #PHP
PHP性能分析工具XHProf安装使用教程
May 13 #PHP
You might like
PHP快速按行读取CSV大文件的封装类分享(也适用于其它超大文本文件)
2014/04/10 PHP
删除PHP数组中的重复元素的实现代码
2017/04/10 PHP
在网站上应该用的30个jQuery插件整理
2011/11/03 Javascript
windows系统下简单nodejs安装及环境配置
2013/01/08 NodeJs
浅析javascript操作 cookie对象
2014/12/26 Javascript
JS继承用法实例分析
2015/02/05 Javascript
js点击按钮实现水波纹效果代码(CSS3和Canves)
2016/09/15 Javascript
JavaScript中利用for循环遍历数组
2017/01/15 Javascript
深入理解Commonjs规范及Node模块实现
2017/05/17 Javascript
JS 中LocalStorage和SessionStorage的使用
2017/08/17 Javascript
node puppeteer(headless chrome)实现网站登录
2018/05/09 Javascript
angular.js实现列表orderby排序的方法
2018/10/02 Javascript
Vue事件修饰符native、self示例详解
2019/07/09 Javascript
JSON 入门教程基础篇 json入门学习笔记
2020/09/22 Javascript
python实现的生成随机迷宫算法核心代码分享(含游戏完整代码)
2014/07/11 Python
Python实现堡垒机模式下远程命令执行操作示例
2019/05/09 Python
Golang GBK转UTF-8的例子
2019/08/26 Python
numpy 返回函数的上三角矩阵实例
2019/11/25 Python
使用python matploblib库绘制准确率,损失率折线图
2020/06/16 Python
python 抓取知乎指定回答下视频的方法
2020/07/09 Python
实例教程 纯CSS3打造非常炫的加载动画效果
2014/11/05 HTML / CSS
HTML5的结构和语义(1):前言
2008/10/17 HTML / CSS
三陽商会官方网站:Sanyo iStore
2019/05/15 全球购物
澳大利亚最受欢迎的美发用品目的地:AMR
2019/08/28 全球购物
美工的岗位职责
2013/11/14 职场文书
留学自荐信写作方法
2014/01/27 职场文书
爱我中华教学反思
2014/04/28 职场文书
学习雷锋精神演讲稿
2014/05/10 职场文书
县委班子四风对照检查材料思想汇报
2014/09/29 职场文书
2015年党员岗位承诺书
2015/04/27 职场文书
喜迎建国70周年:有关爱国的名言名句
2019/09/24 职场文书
Django如何与Ajax交互
2021/04/29 Python
golang 定时任务方面time.Sleep和time.Tick的优劣对比分析
2021/05/05 Golang
OpenCV-Python直方图均衡化实现图像去雾
2021/06/07 Python
教你怎么用Python selenium操作浏览器对象的基础API
2021/06/23 Python
MySQL七种JOIN类型小结
2021/10/24 MySQL