php5.4新功能Traits
来源:互联网 发布:大数据分析模型 包括 编辑:程序博客网 时间:2024/05/21 11:06
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 用','隔开。
实例代码如下:
<?phptrait ezcReflectionReturnInfo {function getReturnType() {}function getReturnDescription() {}}class ezcReflectionMethod extends ReflectionMethod {use ezcReflectionReturnInfo;/* ... */}class ezcReflectionFunction extends ReflectionFunction {use ezcReflectionReturnInfo;/* ... */}?>
2)优先级
基类中的成员函数将被Traits中的函数覆盖,当前类中的成员函数将覆盖Traits中的函数。
<?phpclass Base { public function sayHello() { echo 'Hello '; }}trait SayWorld { public function sayHello() { parent::sayHello(); echo "World!\n"; }}class MyHelloWorld extends Base { use SayWorld;}class MyHelloWorldExt extends Base {use SayWorld;public function sayHello() { /** * 这里是5.4中的新的改动,5.4之前的版本会提示: * PHP Fatal error: Cannot use string offset as an array * 5.4中改进为返回字符串中的该索引号的字符 */$str = "Arvin";echo $str[0][0];// echo 'A'; }public function shortArray() {$array = ['first', 2, 3, 4];//5.4中的数组简单语法echo $array[0];//5.4中的数组解引用取数组元素方法}}$o = new MyHelloWorld();$o->sayHello();$oe = new MyHelloWorldExt();$oe->sayHello();echo "\n";$oe->shortArray();
输出:Hello World!Afirst
3)多Traits
多个Traits可以添加到一个class的声明中,多个Traits之间用","隔开。
<?phptrait Hello { public function sayHello() { echo 'Hello '; }}trait World { public function sayWorld() { echo 'World'; }}class MyHelloWorld { use Hello, World;}$o = new MyHelloWorld();$o->sayHello();$o->sayWorld();?>
输出结果:
Hello World
4)多Traits冲突
如果添加到同一个class的两个Traits中有相同的函数名称,且没有明确的进行处理,将产生一个错误。
为了解决同一个类中两个Tratis中的同名函数冲突,需要用insteadof操作符来选择正确的函数。
因为方法的唯一性和排他性,'as'操作符允许用在冲突函数之后以解决内部冲突的问题。
<?phptrait A {public function smallTalk() {echo 'a';}public function bigTalk() {echo 'A';}}trait B {public function smallTalk() {echo 'b';}public function bigTalk() {echo 'B';}}class Talker {use A, B {B::smallTalk insteadof A;A::bigTalk insteadof B;}}class Aliased_Talker {use A, B {B::smallTalk insteadof A;A::bigTalk insteadof B;B::bigTalk as talk;}}?>
上面的例子中,Talker使用Traits A 和B,因此两者中相同的函数名称存在冲突。
alker中定义了smallTalk取自Traits B,bigTalk取自Traits A。
Aliased_Talker中通过使用as操作符来确保Traits B中的bigTalk通过别名talk来实现。
5)改变函数访问权限
我们可以使用as语法来改变Traits中函数的访问权限属性。
<?phptrait HelloWorld {public function sayHello() {echo 'Hello World!';}}// Change visibility of sayHello,改变sayHello的访问权限。class MyClass1 {use HelloWorld { sayHello as protected; }}// Alias method with changed visibility// sayHello visibility not changed,设置别名myPrivateHello。class MyClass2 {use HelloWorld { sayHello as private myPrivateHello; }}?>
6)Traits组成新Traits
就像许多类一样可以在类中使用Traits,Traits中一样可以使用Traits。可以在一个Traits中定义一个或者多个Traits,这些Traits 可以作为部分或者全部成员被定义在其他Traits中。
<?phptrait Hello {public function sayHello() {echo 'Hello ';}}trait World {public function sayWorld() {echo 'World!';}}trait HelloWorld {use Hello, World;}class MyHelloWorld {use HelloWorld;}$o = new MyHelloWorld();$o->sayHello();$o->sayWorld();?>
以上例程会输出:
Hello World!
7)抽象Trait成员
为了在类中强制实现某些方法,可以在Traits中使用抽象方法。
例如:
<?phptrait Hello { public function sayHelloWorld() { echo 'Hello '.$this->getWorld(); } abstract public function getWorld();}class MyHelloWorld { private $world; use Hello;public function __construct($world) {$this->world = $world;} public function getWorld() { return $this->world; }}/** * 这里用到了5.4新功能 类实例化解引用操作 * (new class())->method(); */(new MyHelloWorld('Arvin'))->sayHelloWorld();?>该实例输出:Hello Arvin
8)静态Trait成员
在Traits中不能定义static 静态变量,但是可以定义在Tratis的函数中。Tratis中同样可以定义静态函数。
<?phptrait Counter { public function inc() { static $c = 0;//静态变量 $c += 1; echo "$c\n"; }/** * 静态方法 */public static function doSomething() { echo 'Doing something'; }}class C1 { use Counter;}(new C1())->inc(); // echo 1C1::doSomething();?>输出为:1Doing something
9) Traits 定义属性
如果在一个trait中定义了一个属性,则在引用该trait的类中不能定义同名的属性,如果该类中定义有和trait中已定义属性具有相同的名字和访问可见性,则是一个E_STRICT
提示,否则抛出语法错误。
<?phptrait PropertiesTrait { public $x = 1;public $y = 2;}class PropertiesExample { use PropertiesTrait;public $x = 1;//public $y = 3;}$example = new PropertiesExample;echo $example->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的新功能。^_^
- php5.4新功能Traits
- php5.4新功能Traits
- PHP5各个版本的新功能和新特性总结php5.4-5.6(二)
- PHP5.3.x的新功能
- C++ traits(4)
- traits
- traits
- traits
- Traits
- Traits
- PHP5.3新功能与不兼容特性整理
- [转]PHP5.3新功能与不兼容特性整理
- PHP5各个版本的新功能和新特性总结
- PHP Reflection API是PHP5才有的新功能
- PHP Reflection API是PHP5才有的新功能
- PHP5各个版本的新功能和新特性总结
- PHP5各个版本的新功能和新特性总结php5.2-5.4(一)
- JUnit 4 的新功能
- 宅房日志2012-4-28
- ext-basex.js处理的同步请求在Firefox12中不支持(在Firefox11中是支持的)怎么办?(已解答)
- C语言学习之变量
- 动态规划(4)
- 基于Java多线程的下载器源码剖析(一)
- php5.4新功能Traits
- 黑马程序员_交通灯管理系统
- web service
- 利用Window超级终端,修改短信猫波特率
- Mysql 安装编译配置项说明
- 一个游戏程序员的学习资料
- Windows Phone开发(36):动画之DoubleAnimation
- 延迟渲染的一些思考
- Android应用资源---样式资源类型(Style)