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+MYSQL 出现乱码的解决方法
Aug 08 PHP
PHP COOKIE设置为浏览器进程
Jun 21 PHP
fleaphp rolesNameField bug解决方法
Apr 23 PHP
PHP中判断变量为空的几种方法小结
Nov 12 PHP
关于PHP的curl开启问题探讨
Apr 08 PHP
thinkphp多层MVC用法分析
Dec 30 PHP
PHP的几个常用加密函数
Feb 03 PHP
深入理解PHP之OpCode原理详解
Jun 01 PHP
Linux服务器下PHPMailer发送邮件失败的问题解决
Mar 04 PHP
PHP 进度条函数的简单实例
Sep 19 PHP
PHP strripos函数用法总结
Feb 11 PHP
PHP实现将上传图片自动缩放到指定分辨率,并保持清晰度封装类示例
Jun 17 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使用sql数据库 获取字段问题介绍
2013/08/12 PHP
php 创建以UNIX时间戳命名的文件夹(示例代码)
2014/03/08 PHP
javascript第一课
2007/02/27 Javascript
JavaScript在IE和Firefox浏览器下的7个差异兼容写法小结
2010/06/18 Javascript
按给定几率进行随机抽取的js代码
2010/12/28 Javascript
推荐10个2014年最佳的jQuery视频插件
2014/11/12 Javascript
详谈nodejs异步编程
2014/12/04 NodeJs
jQuery中data()方法用法实例
2014/12/27 Javascript
jQuery实现自定义事件的方法
2015/04/17 Javascript
使用Object.defineProperty实现简单的js双向绑定
2016/04/15 Javascript
vue2的todolist入门小项目的详细解析
2017/05/11 Javascript
jQuery选择器_动力节点Java学院整理
2017/07/05 jQuery
微信小程序日历组件使用方法详解
2018/12/29 Javascript
基于JS实现前端压缩上传图片的实例代码
2019/05/14 Javascript
python正则表达式抓取成语网站
2013/11/20 Python
Python、Javascript中的闭包比较
2015/02/04 Python
Python的Tornado框架的异步任务与AsyncHTTPClient
2016/06/27 Python
python rsa 加密解密
2017/03/20 Python
详解Python中类的定义与使用
2017/04/11 Python
python 换位密码算法的实例详解
2017/07/19 Python
python字典值排序并取出前n个key值的方法
2018/10/17 Python
python numpy中cumsum的用法详解
2019/10/17 Python
tensorflow获取预训练模型某层参数并赋值到当前网络指定层方式
2020/01/24 Python
信号生成及DFT的python实现方式
2020/02/25 Python
python生成13位或16位时间戳以及反向解析时间戳的实例
2020/03/03 Python
基于Tensorflow的MNIST手写数字识别分类
2020/06/17 Python
python statsmodel的使用
2020/12/21 Python
SQL数据库笔试题
2016/03/08 面试题
怎么可以提高数据库查询数据的速度
2014/06/28 面试题
美术毕业生求职信
2014/02/25 职场文书
2014全国两会心得体会
2014/03/17 职场文书
领导班子自我剖析材料
2014/08/16 职场文书
农民工预备党员思想汇报
2014/09/14 职场文书
委托培训协议书
2014/11/17 职场文书
签约仪式致辞
2015/07/30 职场文书
2016年母亲节广告语
2016/01/28 职场文书