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 相关文章推荐
zend optimizer在wamp的基础上安装图文教程
Oct 26 PHP
php防止伪造的数据从URL提交方法
Jun 27 PHP
php计算给定时间之前的函数用法实例
Apr 03 PHP
php实现的用户查询类实例
Jun 18 PHP
网页的分页下标生成代码(PHP后端方法)
Feb 03 PHP
php正则表达式验证(邮件地址、Url地址、电话号码、邮政编码)
Mar 14 PHP
PHP图形计数器程序显示网站用户浏览量
Jul 20 PHP
php array_slice 取出数组中的一段序列实例
Nov 04 PHP
降低PHP Redis内存占用
Mar 23 PHP
PHP基于socket实现客户端和服务端通讯功能
Jul 13 PHP
php两点地理坐标距离的计算方法
Dec 29 PHP
php 防护xss,PHP的防御XSS注入的终极解决方案
Apr 01 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
mysq GBKl乱码
2006/11/28 PHP
用PHP实现维护文件代码
2007/06/14 PHP
腾讯QQ微博API接口获取微博内容
2013/10/30 PHP
php快递单号查询接口使用示例
2014/05/05 PHP
PHP实现指定字段的多维数组排序函数分享
2015/03/09 PHP
Centos 6.5下PHP 5.3安装ffmpeg扩展的步骤详解
2017/03/02 PHP
JavaScript中null与undefined分析
2009/07/25 Javascript
javascript学习基础笔记之DOM对象操作
2011/11/03 Javascript
jQuery操作cookie方法实例教程
2014/11/25 Javascript
js分页工具实例
2015/01/28 Javascript
jQuery Validation PlugIn的使用方法详解
2015/12/18 Javascript
JavaScript实战(原生range和自定义特效)简单实例
2016/08/21 Javascript
NodeJs下的测试框架Mocha的简单介绍
2017/02/22 NodeJs
jQuery实现弹窗居中效果类似alert()
2017/02/27 Javascript
js实现数组和对象的深浅拷贝
2017/09/30 Javascript
基于js中style.width与offsetWidth的区别(详解)
2017/11/12 Javascript
JS如何在不同平台实现多语言方式
2020/07/16 Javascript
Javascript基于OOP实实现探测器功能代码实例
2020/08/26 Javascript
Vue 数据响应式相关总结
2021/01/28 Vue.js
[20:46]Ti4循环赛第三日VG vs DK
2014/07/12 DOTA
python socket 超时设置 errno 10054
2014/07/01 Python
深入理解python函数递归和生成器
2016/06/06 Python
使用Python向DataFrame中指定位置添加一列或多列的方法
2019/01/29 Python
Python从入门到精通之环境搭建教程图解
2019/09/26 Python
python-OpenCV 实现将数组转换成灰度图和彩图
2020/01/09 Python
python实现简单井字棋游戏
2020/03/04 Python
Python多线程操作之互斥锁、递归锁、信号量、事件实例详解
2020/03/24 Python
Pycharm中使用git进行合作开发的教程详解
2020/11/17 Python
基于DOM+CSS3实现OrgChart组织结构图插件
2016/03/02 HTML / CSS
澳大利亚有机化妆品网上商店:The Well Store
2020/02/20 全球购物
网络编辑职责
2014/03/01 职场文书
3分钟英语演讲稿
2014/04/29 职场文书
励志演讲稿800字
2014/08/21 职场文书
怎样写离婚协议书
2014/09/10 职场文书
社区端午节活动总结
2015/02/11 职场文书
军训心得体会范文(2016最新篇)
2016/01/11 职场文书