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 相关文章推荐
php addslashes和mysql_real_escape_string
Jan 24 PHP
基于php iconv函数的使用详解
Jun 09 PHP
解析php中eclipse 用空格替换 tab键
Jun 24 PHP
php 下载保存文件保存到本地的两种实现方法
Aug 12 PHP
PHP中把stdClass Object转array的几个方法
May 08 PHP
PHP自定session保存路径及删除、注销与写入的方法
Nov 18 PHP
php去除html标记的原生函数详解
Jan 27 PHP
php实现的IMEI限制的短信验证码发送类
May 05 PHP
php使用Jpgraph绘制复杂X-Y坐标图的方法
Jun 10 PHP
Twig模板引擎用法入门教程
Jan 20 PHP
php查找字符串中第一个非0的位置截取
Feb 27 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+SqlServer实现分页显示
2006/10/09 PHP
PHP 获取目录下的图片并随机显示的代码
2009/12/28 PHP
PHP Static延迟静态绑定用法分析
2016/03/16 PHP
PHP strip_tags() 去字符串中的 HTML、XML 以及 PHP 标签的函数
2016/05/22 PHP
js图片实时加载提供网页打开速度
2014/09/11 Javascript
jQuery $命名冲突解决方案汇总
2014/11/13 Javascript
js实现跨域的方法实例详解
2015/06/24 Javascript
JS实现可关闭的对联广告效果代码
2015/09/14 Javascript
解决拦截器对ajax请求的拦截实例详解
2016/12/21 Javascript
jQuery中layer分页器的使用
2017/03/13 Javascript
使用 vue.js 构建大型单页应用
2018/02/10 Javascript
Vue2.0 实现移动端图片上传功能
2018/05/30 Javascript
js取小数点后两位四种方法
2019/01/18 Javascript
Nuxt的路由动画效果案例
2020/11/06 Javascript
vue element和nuxt的使用技巧分享
2021/01/14 Vue.js
python读取注册表中值的方法
2013/04/08 Python
python使用Flask框架获取用户IP地址的方法
2015/03/21 Python
Python中List.index()方法的使用教程
2015/05/20 Python
给Python入门者的一些编程建议
2015/06/15 Python
[原创]教女朋友学Python(一)运行环境搭建
2017/11/29 Python
浅谈Python中带_的变量或函数命名
2017/12/04 Python
基于python log取对数详解
2018/06/08 Python
对Pandas MultiIndex(多重索引)详解
2018/11/16 Python
python中hasattr()、getattr()、setattr()函数的使用
2019/08/16 Python
基于python和flask实现http接口过程解析
2020/06/15 Python
Python实现弹球小游戏
2020/08/01 Python
python绘制雷达图实例讲解
2021/01/03 Python
怎样声明一个匿名的内部类
2016/06/01 面试题
创业资金计划书
2014/02/06 职场文书
委托公证书
2014/04/08 职场文书
医院营销工作计划
2015/01/16 职场文书
写给媳妇的检讨书
2015/05/06 职场文书
捐款仪式主持词
2015/07/04 职场文书
新郎结婚感言
2015/07/31 职场文书
创业计划书之情侣餐厅
2019/09/29 职场文书
详解Redis主从复制实践
2021/05/19 Redis