0

0

Traits的用法

php中文网

php中文网

发布时间:2016-07-29 09:15:16

|

1665人浏览过

|

来源于php中文网

原创

原文出处:http://blog.csdn.net/longlongmylove/article/details/7521379
php5.4新功能Traits介绍1. traits
Traits是在5.4中新增的一个用于实现代码重用的方法。php是一种单一继承的语言,我们无法像java一样在一个class中extends多个基类来实现代码重用,现在Traits能解决这一代码重用的问题,它能让开发者在多个不同的class中实现代码重用。
Traits和class在语义的定义上都是为了减少代码的复杂性,避免多重继承的问题。Traits 和class相似,但是仅用于以统一和较细粒度的方式来提供一组功能,在Traits内部无法进行实例化,即不存在类似class的构造函数__construct()。Traits作为一个php传统继承的扩展并实现水平集成;因此,在应用程序的class中可以不再需要继承。1)如何使用
在类中用关键字'use' 来引用 Traits。多个Traits 用','隔开。实例代码如下:

VisualizeAI
VisualizeAI

用AI把你的想法变成现实

下载

[php] view plaincopy

  1. trait ezcReflectionReturnInfo {  
  2. function getReturnType() {  
  3. }  
  4. function getReturnDescription() {  
  5. }  
  6. }class ezcReflectionMethod extends ReflectionMethod {  
  7. use ezcReflectionReturnInfo;  
  8. /* ... */  
  9. }  
  10. class ezcReflectionFunction extends ReflectionFunction {  
  11. use ezcReflectionReturnInfo;  
  12. /* ... */  
  13. }  
  14. ?>  
 2)优先级
基类中的成员函数将被Traits中的函数覆盖,当前类中的成员函数将覆盖Traits中的函数。

[php] view plaincopy

  1. class Base {  
  2.     public function sayHello() {  
  3.         echo 'Hello ';  
  4.     }  
  5. }  
  6.   
  7. trait SayWorld {  
  8.     public function sayHello() {  
  9.         parent::sayHello();  
  10.         echo "World!\n";  
  11.     }  
  12. }  
  13.   
  14. class MyHelloWorld extends Base {  
  15.     use SayWorld;  
  16. }  
  17.   
  18. class MyHelloWorldExt extends Base {  
  19.     use SayWorld;  
  20.     public function sayHello() {  
  21.         /** 
  22.          * 这里是5.4中的新的改动,5.4之前的版本会提示: 
  23.          * PHP Fatal error:  Cannot use string offset as an array 
  24.          * 5.4中改进为返回字符串中的该索引号的字符 
  25.          */  
  26.         $str  = "Arvin";  
  27.         echo $str[0][0];// echo 'A';  
  28.     }  
  29.   
  30.     public function shortArray() {  
  31.         $array = ['first', 2, 3, 4];//5.4中的数组简单语法  
  32.         echo $array[0];//5.4中的数组解引用取数组元素方法  
  33.     }  
  34. }  
  35.   
  36. $o = new MyHelloWorld();  
  37. $o->sayHello();  
  38. $oe = new MyHelloWorldExt();  
  39. $oe->sayHello();  
  40. echo "\n";  
  41. $oe->shortArray();  

[php] view plaincopy

  1. 输出:  
  2. Hello World!  
  3. A  
  4. first  
 3)多Traits多个Traits可以添加到一个class的声明中,多个Traits之间用","隔开。

[php] view plaincopy

  1. trait Hello {  
  2.     public function sayHello() {  
  3.         echo 'Hello ';  
  4.     }  
  5. }  
  6.   
  7. trait World {  
  8.     public function sayWorld() {  
  9.         echo 'World';  
  10.     }  
  11. }  
  12.   
  13. class MyHelloWorld {  
  14.     use Hello, World;  
  15. }  
  16.   
  17. $o = new MyHelloWorld();  
  18. $o->sayHello();  
  19. $o->sayWorld();  
  20. ?>  
输出结果:
Hello World
4)多Traits冲突
如果添加到同一个class的两个Traits中有相同的函数名称,且没有明确的进行处理,将产生一个错误。
为了解决同一个类中两个Tratis中的同名函数冲突,需要用insteadof操作符来选择正确的函数。
因为方法的唯一性和排他性,'as'操作符允许用在冲突函数之后以解决内部冲突的问题。

[php] view plaincopy

  1. trait A {  
  2. public function smallTalk() {  
  3. echo 'a';  
  4. }  
  5. public function bigTalk() {  
  6. echo 'A';  
  7. }  
  8. }  
  9.   
  10. trait B {  
  11. public function smallTalk() {  
  12. echo 'b';  
  13. }  
  14. public function bigTalk() {  
  15. echo 'B';  
  16. }  
  17. }  
  18.   
  19. class Talker {  
  20. use A, B {  
  21. B::smallTalk insteadof A;  
  22. A::bigTalk insteadof B;  
  23. }  
  24. }  
  25.   
  26. class Aliased_Talker {  
  27. use A, B {  
  28. B::smallTalk insteadof A;  
  29. A::bigTalk insteadof B;  
  30. B::bigTalk as talk;  
  31. }  
  32. }  
  33. ?>  
上面的例子中,Talker使用Traits A 和B,因此两者中相同的函数名称存在冲突。
alker中定义了smallTalk取自Traits B,bigTalk取自Traits A。
Aliased_Talker中通过使用as操作符来确保Traits B中的bigTalk通过别名talk来实现。
5)改变函数访问权限
我们可以使用as语法来改变Traits中函数的访问权限属性。

[php] view plaincopy

  1. trait HelloWorld {  
  2. public function sayHello() {  
  3. echo 'Hello World!';  
  4. }  
  5. }  
  6.   
  7. // Change visibility of sayHello,改变sayHello的访问权限。  
  8. class MyClass1 {  
  9. use HelloWorld { sayHello as protected; }  
  10. }  
  11.   
  12. // Alias method with changed visibility  
  13. // sayHello visibility not changed,设置别名myPrivateHello。  
  14. class MyClass2 {  
  15. use HelloWorld { sayHello as private myPrivateHello; }  
  16. }  
  17. ?>  
 6)Traits组成新Traits
就像许多类一样可以在类中使用Traits,Traits中一样可以使用Traits。可以在一个Traits中定义一个或者多个Traits,这些Traits 可以作为部分或者全部成员被定义在其他Traits中。

[php] view plaincopy

  1. trait Hello {  
  2. public function sayHello() {  
  3. echo 'Hello ';  
  4. }  
  5. }  
  6.   
  7. trait World {  
  8. public function sayWorld() {  
  9. echo 'World!';  
  10. }  
  11. }  
  12.   
  13. trait HelloWorld {  
  14. use Hello, World;  
  15. }  
  16.   
  17. class MyHelloWorld {  
  18. use HelloWorld;  
  19. }  
  20.   
  21. $o = new MyHelloWorld();  
  22. $o->sayHello();  
  23. $o->sayWorld();  
  24. ?>  
以上例程会输出:

[php] view plaincopy

  1. Hello World!  
7)抽象Trait成员
为了在类中强制实现某些方法,可以在Traits中使用抽象方法。
例如:

[php] view plaincopy

  1. trait Hello {  
  2.     public function sayHelloWorld() {  
  3.         echo 'Hello '.$this->getWorld();  
  4.     }  
  5.     abstract public function getWorld();  
  6. }  
  7.   
  8. class MyHelloWorld {  
  9.     private $world;  
  10.     use Hello;  
  11.     public function __construct($world) {  
  12.         $this->world = $world;  
  13.     }  
  14.     public function getWorld() {  
  15.         return $this->world;  
  16.     }  
  17. }  
  18.   
  19. /** 
  20.  * 这里用到了5.4新功能 类实例化解引用操作 
  21.  * (new class())->method(); 
  22.  */  
  23. (new MyHelloWorld('Arvin'))->sayHelloWorld();  
  24. ?>  
  25.   
  26. 该实例输出:  
  27. Hello Arvin  
 8)静态Trait成员在Traits中不能定义static 静态变量,但是可以定义在Tratis的函数中。Tratis中同样可以定义静态函数。

[php] view plaincopy

  1. trait Counter {  
  2.     public function inc() {  
  3.         static $c = 0;//静态变量  
  4.         $c += 1;  
  5.         echo "$c\n";  
  6.     }  
  7.     /** 
  8.      * 静态方法 
  9.      */  
  10.     public static function doSomething() {  
  11.         echo 'Doing something';  
  12.     }  
  13. }  
  14.   
  15. class C1 {  
  16.     use Counter;  
  17. }  
  18.   
  19. (new C1())->inc(); // echo 1  
  20. C1::doSomething();  
  21. ?>  
  22. 输出为:  
  23. 1  
  24. Doing something  
9) Traits 定义属性如果在一个trait中定义了一个属性,则在引用该trait的类中不能定义同名的属性,如果该类中定义有和trait中已定义属性具有相同的名字和访问可见性,则是一个E_STRICT 提示,否则抛出语法错误。
x, $example->y;
?>

输出:
12
 在最后贴上php5.4.0部分新功能changelog:
Added short array syntax support ([1,2,3]), see UPGRADING guide for full details.
Added binary numbers format (0b001010).
Added support for Class::{expr}() syntax.
Added support for Traits.//本文的主要内容
Added closure $this support back.
Added array dereferencing support.//数组解引用支持,上文中有实例
Added callable typehint.
Added indirect method call through array. #47160.
Added DTrace support.//传说DTrace是一个性能分析工具,可以跟踪出函数调用点,返回点等数据
Added class member access on instantiation (e.g. (new foo)->bar()) support.//类新实例解引用操作,上文中有实例
本文旨在抛砖引玉,希望大家一起继续探究php5.4的新功能。^_^

以上就介绍了Traits的用法,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

相关专题

更多
php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

65

2025.12.31

php网站源码教程大全
php网站源码教程大全

本专题整合了php网站源码相关教程,阅读专题下面的文章了解更多详细内容。

43

2025.12.31

视频文件格式
视频文件格式

本专题整合了视频文件格式相关内容,阅读专题下面的文章了解更多详细内容。

35

2025.12.31

不受国内限制的浏览器大全
不受国内限制的浏览器大全

想找真正自由、无限制的上网体验?本合集精选2025年最开放、隐私强、访问无阻的浏览器App,涵盖Tor、Brave、Via、X浏览器、Mullvad等高自由度工具。支持自定义搜索引擎、广告拦截、隐身模式及全球网站无障碍访问,部分更具备防追踪、去谷歌化、双内核切换等高级功能。无论日常浏览、隐私保护还是突破地域限制,总有一款适合你!

41

2025.12.31

出现404解决方法大全
出现404解决方法大全

本专题整合了404错误解决方法大全,阅读专题下面的文章了解更多详细内容。

204

2025.12.31

html5怎么播放视频
html5怎么播放视频

想让网页流畅播放视频?本合集详解HTML5视频播放核心方法!涵盖<video>标签基础用法、多格式兼容(MP4/WebM/OGV)、自定义播放控件、响应式适配及常见浏览器兼容问题解决方案。无需插件,纯前端实现高清视频嵌入,助你快速打造现代化网页视频体验。

9

2025.12.31

关闭win10系统自动更新教程大全
关闭win10系统自动更新教程大全

本专题整合了关闭win10系统自动更新教程大全,阅读专题下面的文章了解更多详细内容。

8

2025.12.31

阻止电脑自动安装软件教程
阻止电脑自动安装软件教程

本专题整合了阻止电脑自动安装软件教程,阅读专题下面的文章了解更多详细教程。

3

2025.12.31

html5怎么使用
html5怎么使用

想快速上手HTML5开发?本合集为你整理最实用的HTML5使用指南!涵盖HTML5基础语法、主流框架(如Bootstrap、Vue、React)集成方法,以及无需安装、直接在线编辑运行的平台推荐(如CodePen、JSFiddle)。无论你是新手还是进阶开发者,都能轻松掌握HTML5网页制作、响应式布局与交互功能开发,零配置开启高效前端编程之旅!

2

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
前端系列快速入门课程
前端系列快速入门课程

共4课时 | 0.4万人学习

react hooks实战移动端企业级项目
react hooks实战移动端企业级项目

共59课时 | 6.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号