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简单静态页生成过程
Mar 27 PHP
MySQL连接数超过限制的解决方法
Jul 17 PHP
PHP ? EasyUI DataGrid 资料存的方式介绍
Nov 07 PHP
PHP Directory 函数的详解
Mar 07 PHP
邮箱正则表达式实现代码(针对php)
Jun 21 PHP
使用淘宝IP库获取用户ip地理位置
Oct 27 PHP
PHP函数分享之curl方式取得数据、模拟登陆、POST数据
Jun 04 PHP
PHP中require和include路径问题详解
Dec 25 PHP
PHP连接access数据库
Mar 27 PHP
php文件下载处理方法分析
Apr 22 PHP
PHP实现网站访问量计数器
Oct 27 PHP
PHP实现无限极分类的两种方式示例【递归和引用方式】
Mar 25 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 网页游戏开发入门教程一(webgame+design)
2009/10/26 PHP
thinkphp制作404跳转页的简单实现方法
2016/09/22 PHP
详谈PHP面向对象中常用的关键字和魔术方法
2017/02/04 PHP
Laravel使用支付宝进行支付的示例代码
2017/08/16 PHP
利用JS重写Cognos右键菜单的实现代码
2010/04/11 Javascript
基于jquery的弹出提示框始终处于窗口的居中位置(类似于alert弹出框的效果)
2011/09/28 Javascript
页面右下角弹出提示框示例代码js版
2013/08/02 Javascript
String.prototype实现的一些javascript函数介绍
2013/11/22 Javascript
js动态修改整个页面样式达到换肤效果
2014/05/23 Javascript
JS逆序遍历实现代码
2014/12/02 Javascript
sails框架的学习指南
2014/12/22 Javascript
JS实现可缩放、拖动、关闭和最小化的浮动窗口完整实例
2015/03/04 Javascript
Jquery网页内滑动缓冲导航的实现代码
2015/04/05 Javascript
js实现的黑背景灰色二级导航菜单效果代码
2015/08/24 Javascript
Svg.js实例教程及使用手册详解(一)
2016/05/16 Javascript
微信小程序与后台PHP交互的方法实例分析
2018/12/10 Javascript
vue中axios实现数据交互与跨域问题
2019/05/12 Javascript
js实现鼠标点击页面弹出自定义文字效果
2019/12/24 Javascript
微信小程序如何获取地址
2019/12/24 Javascript
如何使用jQuery操作Cookies方法解析
2020/09/08 jQuery
jQuery实现可以扩展的日历
2020/12/01 jQuery
连接Python程序与MySQL的教程
2015/04/29 Python
浅析Python基础-流程控制
2016/03/18 Python
Python 的类、继承和多态详解
2017/07/16 Python
pandas 实现将重复表格去重,并重新转换为表格的方法
2018/04/18 Python
pygame游戏之旅 按钮上添加文字的方法
2018/11/21 Python
python递归法实现简易连连看小游戏
2020/03/25 Python
python给视频添加背景音乐并改变音量的具体方法
2020/07/19 Python
学生实习推荐信范文
2013/11/26 职场文书
2014植树节活动总结
2014/03/11 职场文书
飘柔洗发水广告词
2014/03/14 职场文书
教师自我剖析材料(群众路线)
2014/09/29 职场文书
班子成员四风问题自我剖析材料
2014/09/29 职场文书
单位接收函范文
2015/01/30 职场文书
生死牛玉儒观后感
2015/06/11 职场文书
java获取一个文本文件的编码(格式)信息
2022/09/23 Java/Android