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自动适应范围的分页代码
Aug 05 PHP
php中神奇的fastcgi_finish_request
May 02 PHP
php join函数应用
May 04 PHP
PHP获取网址的顶级域名函数代码
Sep 24 PHP
php 注册时输入信息验证器的实现详解
Jul 05 PHP
PHP5中实现多态的两种方法实例分享
Apr 21 PHP
php中curl和file_get_content的区别
May 10 PHP
php遍历类中包含的所有元素的方法
May 12 PHP
PHP执行SQL文件并将SQL文件导入到数据库
Sep 17 PHP
CI框架源码解读之URI.php中_fetch_uri_string()函数用法分析
May 18 PHP
Yii多表联合查询操作详解
Jun 02 PHP
PHP简单遍历对象示例
Sep 28 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
《DOTA3》开发工作已经开始 《DOTA3》将代替《DOTA2》
2021/03/06 DOTA
PHP SEO优化之URL优化方法
2011/04/21 PHP
php的慢速日志引起的Mysql错误问题分析
2014/05/13 PHP
PHP用mysql_insert_id()函数获得刚插入数据或当前发布文章的ID
2016/11/25 PHP
jquery异步跨域访问代码
2013/06/28 Javascript
深入理解JavaScript高级之词法作用域和作用域链
2013/12/10 Javascript
Jquery模仿Baidu、Google搜索时自动补充搜索结果提示
2013/12/26 Javascript
无刷新上传文件并返回自定义值
2015/06/11 Javascript
学习javascript面向对象 理解javascript对象
2016/01/04 Javascript
JavaScript探测CSS动画是否已经完成的方法
2016/08/30 Javascript
基于javascript实现的购物商城商品倒计时实例
2016/12/11 Javascript
CodeMirror js代码加亮使用总结
2017/03/25 Javascript
JavaScript数据结构之二叉树的查找算法示例
2017/04/13 Javascript
微信小程序之获取当前位置经纬度以及地图显示详解
2017/05/09 Javascript
Bootstrap实现翻页效果
2017/11/27 Javascript
关于angular浏览器兼容性问题的解决方案
2020/07/26 Javascript
使用Webpack 搭建 Vue3 开发环境过程详解
2020/07/28 Javascript
python制作企业邮箱的爆破脚本
2016/10/05 Python
python list排序的两种方法及实例讲解
2017/03/20 Python
Python创建二维数组实例(关于list的一个小坑)
2017/11/07 Python
python实现TF-IDF算法解析
2018/01/02 Python
关于Python作用域自学总结
2019/06/10 Python
使用python脚本自动创建pip.ini配置文件代码实例
2019/09/20 Python
Python模块汇总(常用第三方库)
2019/10/07 Python
python GUI库图形界面开发之PyQt5动态(可拖动控件大小)布局控件QSplitter详细使用方法与实例
2020/03/06 Python
Python爬虫工具requests-html使用解析
2020/04/29 Python
Python sorted对list和dict排序
2020/06/09 Python
python爬虫今日热榜数据到txt文件的源码
2021/02/23 Python
CSS3 清除浮动的方法示例
2018/06/01 HTML / CSS
HTML5、Select下拉框右边加图标的实现代码(增进用户体验)
2017/10/16 HTML / CSS
怎样创建、运行java程序
2014/08/01 面试题
音乐教学反思
2014/02/02 职场文书
社区安全检查制度
2014/02/03 职场文书
体育教师个人的自我评价
2014/02/16 职场文书
婚礼父母致辞
2015/07/28 职场文书
python自动化八大定位元素讲解
2021/07/09 Python