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中调用JAVA
Oct 09 PHP
PHP5新特性: 更加面向对象化的PHP
Nov 18 PHP
CodeIgniter php mvc框架 中国网站
May 26 PHP
浅谈PHP 闭包特性在实际应用中的问题
Oct 30 PHP
php标签云的实现代码
Oct 10 PHP
php命名空间学习详解
Feb 27 PHP
php中的curl_multi系列函数使用例子
Jul 29 PHP
再Docker中架设完整的WordPress站点全攻略
Jul 29 PHP
PHP使用反射机制实现查找类和方法的所在位置
Apr 22 PHP
PHP中模糊查询并关联三个select框
Jun 19 PHP
详解Laravel设置多态关系模型别名的方式
Oct 17 PHP
Laravel重定向,a链接跳转,控制器跳转示例
Oct 22 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 is_dir() 判断给定文件名是否是一个目录
2010/05/10 PHP
PHP数据库连接mysql与mysqli对比分析
2016/01/04 PHP
Linux平台PHP5.4设置FPM线程数量的方法
2016/11/09 PHP
php输出含有“#”字符串的方法
2017/01/18 PHP
RR vs IO BO3 第二场2.13
2021/03/10 DOTA
Javascript----文件操作
2007/01/18 Javascript
JQuery 选项卡效果(JS与HTML的分离)
2010/04/01 Javascript
用JQuery模仿淘宝的图片放大镜显示效果
2011/09/15 Javascript
jQuery中next()方法用法实例
2015/01/07 Javascript
JSON字符串转JSON对象
2015/07/31 Javascript
12种JavaScript常用的MVC框架比较分析
2015/11/16 Javascript
Javascript实现图片加载从模糊到清晰显示的方法
2016/06/21 Javascript
jQuery实现的超链接提示效果示例【附demo源码下载】
2016/09/09 Javascript
微信小程序技巧之show内容展示,上传文件编码问题
2017/01/23 Javascript
element-ui中的select下拉列表设置默认值方法
2018/08/24 Javascript
详解js删除数组中的指定元素
2018/10/31 Javascript
浅谈Angular 观察者模式理解
2018/11/01 Javascript
详解实现一个通用的“划词高亮”在线笔记功能
2019/04/23 Javascript
JavaScript函数式编程(Functional Programming)组合函数(Composition)用法分析
2019/05/22 Javascript
基于ajax及jQuery实现局部刷新过程解析
2020/09/12 jQuery
python多重继承实例
2014/10/11 Python
Python实现基于多线程、多用户的FTP服务器与客户端功能完整实例
2017/08/18 Python
利用Python正则表达式过滤敏感词的方法
2019/01/21 Python
python安装pil库方法及代码
2019/06/25 Python
python启动应用程序和终止应用程序的方法
2019/06/28 Python
解决pyCharm中 module 调用失败的问题
2020/02/12 Python
使用CSS3设计地图上的雷达定位提示效果
2016/04/05 HTML / CSS
美国最灵活的移动提供商:Tello
2017/07/18 全球购物
工作自我评价分享
2013/12/01 职场文书
求职自荐书范文
2013/12/04 职场文书
秋收起义观后感
2015/06/11 职场文书
爱岗敬业事迹材料
2019/06/20 职场文书
MySQL修改默认引擎和字符集详情
2021/09/25 MySQL
各种货币符号快捷输入
2022/02/17 杂记
Java存储没有重复元素的数组
2022/04/29 Java/Android
本地搭建minio文件服务器(使用bat脚本启动)的方法
2022/07/15 Servers