一只大脸猫博客主要分享PHP开发技巧、Web前端技术、网站优化、网站排名、修电脑、心灵鸡汤等一些生活中遇到的事、道理和技巧。分享更多知识给身边的朋友。
一只大脸猫博客主要分享PHP开发技巧、Web前端技术、网站优化、网站排名、修电脑、心灵鸡汤等一些生活中遇到的事、道理和技巧。分享更多知识给身边的朋友。

PHP 7 新特性三 Traits


Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用 method。Trait 和 Class 组合的语义定义了一种减少复杂性的方式,避免传统多继承和 Mixin 类相关典型问题。

Trait 和 Class 相似,但仅仅旨在用细粒度和一致的方式来组合功能。 无法通过 trait 自身来实例化。它为传统继承增加了水平特性的组合;也就是说,应用的几个 Class 之间不需要继承。

<?php
trait ezcReflectionReturnInfo {
    function getReturnType() { /*业务逻辑1*/ }
    function getReturnDescription() { /*业务逻辑2*/ }
}

class ezcReflectionMethod extends ReflectionMethod {
    use ezcReflectionReturnInfo;//进行继承可以在当前类中直接调用
    /* .业务逻辑. */
}

class ezcReflectionFunction extends ReflectionFunction {
    use ezcReflectionReturnInfo;
    /* .业务逻辑. */
}

优先级[本类=》trait类=》父类]

从基类继承的成员会被 trait 插入的成员所覆盖。优先顺序是来自当前类的成员覆盖了 trait 的方法,而 trait 则覆盖了被继承的方法。

<?php
class Base {
    public function sayHello() {
        echo 'Hello ';
    }
}

trait SayWorld {
    public function sayHello() {
        parent::sayHello();
        echo 'World!';
    }
}

class MyHelloWorld extends Base {
    use SayWorld;
}

$o = new MyHelloWorld();
$o->sayHello();
//以上例程会输出:
//Hello World!

从基类继承的成员被插入的 SayWorld Trait 中的 MyHelloWorld 方法所覆盖。其行为 MyHelloWorld 类中定义的方法一致。优先顺序是当前类中的方法会覆盖 trait 方法,而 trait 方法又覆盖了基类中的方法。

多个 trait

通过逗号分隔,在 use 声明列出多个 trait,可以都插入到一个类中。

<?php
trait Hello {
    public function sayHello() {
        echo 'Hello ';
    }
}

trait World {
    public function sayWorld() {
        echo 'World';
    }
}

class MyHelloWorld {
    use Hello, World;
    public function sayExclamationMark() {
        echo '!';
    }
}

$o = new MyHelloWorld();
$o->sayHello();
$o->sayWorld();
$o->sayExclamationMark();
//以上例程会输出:
//Hello World!

冲突的解决

如果两个 trait 都插入了一个同名的方法,如果没有明确解决冲突将会产生一个致命错误。

为了解决多个 trait 在同一个类中的命名冲突,需要使用 insteadof 操作符来明确指定使用冲突方法中的哪一个。

以上方式仅允许排除掉其它方法,as 操作符可以 为某个方法引入别名。 注意,as 操作符不会对方法进行重命名,也不会影响其方法。

修改方法的访问控制

使用 as 语法还可以用来调整方法的访问控制。

<?php
trait HelloWorld {
    public function sayHello() {
        echo 'Hello World!';
    }
}

// 修改 sayHello 的访问控制
class MyClass1 {
    use HelloWorld { sayHello as protected; }
}

// 给方法一个改变了访问控制的别名
// 原版 sayHello 的访问控制则没有发生变化
class MyClass2 {
    use HelloWorld { sayHello as private myPrivateHello; }
}

从 trait 来组成 trait

正如 class 能够使用 trait 一样,其它 trait 也能够使用 trait。在 trait 定义时通过使用一个或多个 trait,能够组合其它 trait 中的部分或全部成员。

Trait 的抽象成员

为了对使用的类施加强制要求,trait 支持抽象方法的使用。

Trait 的静态成员

Traits 可以被静态成员静态方法定义。

属性

Trait 同样可以定义属性。

Trait 定义了一个属性后,类就不能定义同样名称的属性,否则会产生 fatal error。 有种情况例外:属性是兼容的(同样的访问可见度、初始默认值)。 在 PHP 7.0 之前,属性是兼容的,则会有 E_STRICT 的提醒。

Trait 是一种重用代码的机制,它可以减少单继承的某些限制。Traits 与类组合的语义定义了降低复杂性的方式,并避免了与多重继承和 Mixins 相关的典型问题。

Trait 类似于类,但仅用于以细粒度和一致的方式对函数进行分组,它是对传统继承的补充,可以实现行为的横向组合,类成员应用不需要继承。



PHP 7 新特性三 Traits:http://www.yzdlm.com/php/11.html

作者:大脸猫 分类: PHP博客


上一篇:PHP 7 新特性二 Null coalescing operator(空合并运算符) 下一篇:PHP 7新特性四 Typed properties (属性类型化)

评论


乖,登录后才可以留言!
QQ一键登录

相关文章

0、2019-09-14——Zend创始人提议创建PHP方言,暂命名为P++
1、2019-07-20——PHP开发环境:composer 下载扩展包慢怎么办?
2、2019-07-20——composer如何安装?
3、2019-07-17——PHP 开发者该知道的 5 个 Composer 小技巧
4、2019-07-16——Composer 是什么?
5、2019-06-12——PHP 7新特性五 Spread operator(数组延展操作符)
6、2019-06-01——为什么大家总喜欢黑PHP?PHP到底做错了什么
7、2019-05-24——PHP 7新特性四 Typed properties (属性类型化)
8、2019-05-24——PHP 7 新特性三 Traits
9、2019-05-23——PHP 7 新特性二 Null coalescing operator(空合并运算符)
10、2019-05-23——PHP 7新特性一 Short closures 短闭包
11、2019-05-22——在线编辑器实现代码高亮展示
12、2019-05-21——PHP早已不是十年前的鸟样
13、2019-05-20——PHP是什么?
Top