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脚本的10个技巧(4)
Oct 09 PHP
Email+URL的判断和自动转换函数
Oct 09 PHP
PHP session常见问题集锦及解决办法总结
Mar 18 PHP
php download.php实现代码 跳转到下载文件(response.redirect)
Aug 26 PHP
PHP执行批量mysql语句的解决方法
May 02 PHP
php curl模拟post请求小实例
Nov 13 PHP
php实现将任意进制数转换成10进制的方法
Apr 17 PHP
分享php邮件管理器源码
Jan 06 PHP
php+redis实现商城秒杀功能
Nov 19 PHP
浅谈Laravel中的三种中间件的作用
Oct 13 PHP
Laravel定时任务的每秒执行代码
Oct 22 PHP
PHP笛卡尔积实现原理及代码实例
Dec 09 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字符串截取中文截取2,单字节截取模式
2007/12/10 PHP
Can't create/write to file 'C:\WINDOWS\TEMP\...MYSQL报错解决方法
2011/06/30 PHP
php使用explode()函数将字符串拆分成数组的方法
2015/02/17 PHP
小程序微信支付功能配置方法示例详解【基于thinkPHP】
2019/05/05 PHP
获取select元素被选中的文本内容的js代码
2014/01/29 Javascript
node.js中的url.format方法使用说明
2014/12/10 Javascript
jQuery中:contains选择器用法实例
2014/12/30 Javascript
jquery马赛克拼接翻转效果代码分享
2015/08/24 Javascript
详解页面滚动值scrollTop在FireFox与Chrome浏览器间的兼容问题
2015/12/03 Javascript
浅析JavaScript声明变量
2015/12/21 Javascript
jQuery Select下拉框操作小结(推荐)
2016/07/22 Javascript
详解Vue中一种简易路由传参办法
2017/09/15 Javascript
详解Angular5 服务端渲染实战
2018/01/04 Javascript
基于element-ui组件手动实现单选和上传功能
2018/12/06 Javascript
JavaScript数据结构与算法之检索算法实例分析【顺序查找、最大最小值、自组织查询】
2019/02/22 Javascript
vue路由权限校验功能的实现代码
2020/06/07 Javascript
JS跨浏览器解析XML应用过程详解
2020/10/16 Javascript
vue在图片上传的时候压缩图片
2020/11/18 Vue.js
python通过配置文件共享全局变量的实例
2019/01/11 Python
python下PyGame的下载与安装过程及遇到问题
2019/08/04 Python
python抓取多种类型的页面方法实例
2019/11/20 Python
Python写出新冠状病毒确诊人数地图的方法
2020/02/12 Python
浅谈对python中if、elif、else的误解
2020/08/20 Python
python入门教程之基本算术运算符
2020/11/13 Python
使用jTopo给Html5 Canva中绘制的元素添加鼠标事件
2014/05/15 HTML / CSS
html5唤醒APP小记
2019/03/27 HTML / CSS
阿拉伯世界最大的电子商务网站:Souq沙特阿拉伯
2016/10/28 全球购物
《日月潭》教学反思
2014/02/28 职场文书
高一学生评语大全
2014/04/25 职场文书
园艺师求职信
2014/04/27 职场文书
政府绩效管理实施方案
2014/05/04 职场文书
关于国庆节的演讲稿
2014/09/05 职场文书
党员个人对照检查材料思想汇报
2014/09/16 职场文书
干部考核工作总结2015
2015/07/24 职场文书
安全生产学习心得体会
2016/01/18 职场文书
MySQL 全文索引使用指南
2021/05/25 MySQL