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写的serv-u的web申请账号的程序
Oct 09 PHP
php5中date()得出的时间为什么不是当前时间的解决方法
Jun 30 PHP
网页游戏开发入门教程三(简单程序应用)
Nov 02 PHP
PHP CURL模拟登录新浪微博抓取页面内容 基于EaglePHP框架开发
Jan 16 PHP
php模板原理讲解
Nov 13 PHP
PHP语法自动检查的Vim插件
Aug 11 PHP
php使用Cookie控制访问授权的方法
Jan 21 PHP
php版微信公众号接口实现发红包的方法
Oct 14 PHP
CodeIgniter整合Smarty的方法详解
Aug 25 PHP
PHP实现模拟http请求的方法分析
Dec 20 PHP
YII2框架中使用RBAC对模块,控制器,方法的权限控制及规则的使用示例
Mar 18 PHP
为你的 Laravel 验证器加上多验证场景的实现
Apr 07 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之第二天
2006/10/09 PHP
PHP代码网站如何防范SQL注入漏洞攻击建议分享
2012/03/01 PHP
解析在PHP中使用全局变量的几种方法
2013/06/24 PHP
解析php下载远程图片函数 可伪造来路
2013/06/25 PHP
php获取当前url地址的方法小结
2017/01/10 PHP
php中get_magic_quotes_gpc()函数说明
2017/02/06 PHP
php 数组元素快速去重
2017/05/05 PHP
PHP addcslashes()函数讲解
2019/02/03 PHP
教您去掉ie网页加载进度条的方法
2010/12/09 Javascript
jquery的ajaxSubmit()异步上传图片并保存表单数据演示代码
2013/06/04 Javascript
jquery操作checked属性以及disabled属性的多种方法
2014/06/20 Javascript
基于NodeJS的前后端分离的思考与实践(一)全栈式开发
2014/09/26 NodeJs
JS设置网页图片vspace和hspace属性的方法
2015/04/01 Javascript
Bootstrap table分页问题汇总
2016/05/30 Javascript
AngularJS中使用three.js的实例详解
2017/07/21 Javascript
实例分析js事件循环机制
2017/12/13 Javascript
浅谈layui 表单元素的选中问题
2019/10/25 Javascript
详细解读Python中的__init__()方法
2015/05/02 Python
基于python的Tkinter实现一个简易计算器
2015/12/31 Python
星球大战与Python之间的那些事
2016/01/07 Python
关于python下cv.waitKey无响应的原因及解决方法
2019/01/10 Python
Python获取Redis所有Key以及内容的方法
2019/02/19 Python
给我一面国旗 python帮你实现
2019/09/30 Python
python3正则模块re的使用方法详解
2020/02/11 Python
基于python requests selenium爬取excel vba过程解析
2020/08/12 Python
彻底搞懂python 迭代器和生成器
2020/09/07 Python
python爬虫scrapy图书分类实例讲解
2020/11/23 Python
HTML5实现晶莹剔透的雨滴特效
2014/05/14 HTML / CSS
Ben Sherman官方网站:英国男装品牌
2019/10/22 全球购物
英国婚礼商城:Wedding Mall
2019/11/02 全球购物
产品销售员岗位职责
2013/12/18 职场文书
会计电算化专业毕业生推荐信
2013/12/24 职场文书
个人简历自我评价范文
2014/02/04 职场文书
餐饮收银员岗位职责
2014/02/07 职场文书
2014年高考决心书
2014/03/11 职场文书
2014-2015学年工作总结
2014/11/27 职场文书