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安全配置
Oct 09 PHP
一步一步学习PHP(6) 面向对象
Feb 16 PHP
关于访问控制的一首PHP面试题(对属性或方法的访问控制)
Sep 13 PHP
CodeIgniter上传图片成功的全部过程分享
Aug 12 PHP
无刷新动态加载数据 滚动条加载适合评论等页面
Oct 16 PHP
php使用fsockopen函数发送post,get请求获取网页内容的方法
Nov 15 PHP
PHP单例模式详细介绍
Jul 01 PHP
CodeIgniter生成静态页的方法
May 17 PHP
php使用正则表达式去掉html中的注释方法
Nov 03 PHP
Yii框架参数化查询中IN查询只能查询一个的解决方法
May 20 PHP
Laravel框架基于ajax实现二级联动功能示例
Jan 17 PHP
PHP的new static和new self的区别与使用
Nov 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蜘蛛统计插件只要有mysql就可用
2010/10/12 PHP
利用PHP绘图函数实现简单验证码功能的方法
2016/10/18 PHP
JavaScript回调(callback)函数概念自我理解及示例
2013/07/04 Javascript
jQuery操作input值的各种方法总结
2013/11/21 Javascript
利用jQuery简单实现产品展示图片左右滚动功能(示例代码)
2014/01/02 Javascript
Jquery创建层显示标题和内容且随鼠标移动而移动
2014/01/26 Javascript
深入理解javascript原型链和继承
2014/09/23 Javascript
js使用DOM设置单选按钮、复选框及下拉菜单的方法
2015/01/20 Javascript
javascript实现倒计时(精确到秒)
2015/06/26 Javascript
Javascript的无new构建实例详解
2016/05/15 Javascript
使用Web Uploader实现多文件上传
2016/06/08 Javascript
AngularJS基础 ng-focus 指令简单示例
2016/08/01 Javascript
Node.js+Express+MySql实现用户登录注册功能
2017/07/10 Javascript
使用 Node.js 实现图片的动态裁切及算法实例代码详解
2018/09/29 Javascript
layui switch 开关监听 弹出确定状态转换的例子
2019/09/21 Javascript
Vue3项目打包后部署到服务器 请求不到后台接口解决方法
2020/02/06 Javascript
微信小程序调用wx.getImageInfo遇到的坑解决
2020/05/31 Javascript
vue webpack build资源相对路径的问题及解决方法
2020/06/04 Javascript
js实现拖拽与碰撞检测
2020/09/18 Javascript
Python实现将16进制字符串转化为ascii字符的方法分析
2017/07/21 Python
python添加模块搜索路径方法
2017/09/11 Python
python数据结构学习之实现线性表的顺序
2018/09/28 Python
django如何实现视图重定向
2019/07/24 Python
Python拆分大型CSV文件代码实例
2019/10/07 Python
如何提高python 中for循环的效率
2020/04/15 Python
一张图片能隐含千言万语之隐藏你的程序代码
2012/12/13 HTML / CSS
英国口碑最好的的维他命胶囊品牌:Myvitamins(有中文站)
2016/12/03 全球购物
高中美术教学反思
2014/01/19 职场文书
网络工程师职业规划
2014/02/10 职场文书
行政人事岗位职责
2014/03/17 职场文书
开业庆典主持词
2014/03/21 职场文书
顶岗实习计划书
2015/01/16 职场文书
华清池导游词
2015/02/02 职场文书
2016年社区创先争优活动总结
2016/04/05 职场文书
Python基础之赋值,浅拷贝,深拷贝的区别
2021/04/30 Python
nginx刷新页面出现404解决方案(亲测有效)
2022/03/18 Servers