一文聊聊php5.4的新功能Traits

PHPz
发布: 2016-07-29 09:11:13
转载
1739人浏览过

一文聊聊php5.4的新功能Traits

Traits是在5.4中新增的一个用于实现代码重用的方法。

php是一种单一继承的语言,我们无法像java一样在一个class中extends多个基类来实现代码重用,现在Traits能解决这一代码重用的问题,它能让开发者在多个不同的class中实现代码重用。

Traits和class在语义的定义上都是为了减少代码的复杂性,避免多重继承的问题。

Traits 和class相似,但是仅用于以统一和较细粒度的方式来提供一组功能,在Traits内部无法进行实例化,即不存在类似class的构造函数__construct()。Traits作为一个php传统继承的扩展并实现水平集成;因此,在应用程序的class中可以不再需要继承。

立即学习PHP免费学习笔记(深入)”;

1)如何使用

在类中用关键字'use' 来引用 Traits。多个Traits 用','隔开。

实例代码如下:

<?php
trait ezcReflectionReturnInfo {
function getReturnType() {
}
function getReturnDescription() {
}
}class ezcReflectionMethod extends ReflectionMethod {
use ezcReflectionReturnInfo;
/* ... */
}
class ezcReflectionFunction extends ReflectionFunction {
use ezcReflectionReturnInfo;
/* ... */
}
?>
登录后复制

2)优先级

基类中的成员函数将被Traits中的函数覆盖,当前类中的成员函数将覆盖Traits中的函数。

<?php
class 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!
A
first
登录后复制

3)多Traits

多个Traits可以添加到一个class的声明中,多个Traits之间用","隔开。

<?php
trait 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'操作符允许用在冲突函数之后以解决内部冲突的问题。

<?php
trait 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中函数的访问权限属性。

MDWechat微信主题模块
MDWechat微信主题模块

MDWechat是一款xposed插件,能够使使微信Material Design化。功能实现的功能有:1.主界面 TabLayout Material 化,支持自定义图标2.主界面 4 个页面背景修改3.全局 ActionBar 和 状态栏 颜色修改,支持主界面和聊天页面的沉浸主题(4.0新增)4.自动识别微信深色模式以调整MDwechat配色方案(3.6新增)5.主界面添加悬浮按钮(Float

MDWechat微信主题模块 0
查看详情 MDWechat微信主题模块
<?php
trait 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中。

<?php
trait 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中使用抽象方法。

例如:

<?php
trait 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中同样可以定义静态函数。

<?php
trait 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 1
C1::doSomething();
?>
输出为:
1
Doing something
登录后复制

9) Traits 定义属性

如果在一个trait中定义了一个属性,则在引用该trait的类中不能定义同名的属性,如果该类中定义有和trait中已定义属性具有相同的名字和访问可见性,则是一个E_STRICT 提示,否则抛出语法错误。

<?php
trait 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的新功能。^_^

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:CSDN网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

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