php 中的trait 以及它在laravel框架中的使用

2019-04-01  本文已影响0人  大也也

万变不离其宗,我们在看一下 PHP手册中对trait中的解释。解释的篇幅很长。我下面捡重要的说几点

首先引入手册中对trait的介绍


image.png

官方的第一个例子。可以看到trait的使用方法,(原来use除了引用命名空间,还能干这个用)

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

class ezcReflectionMethod extends ReflectionMethod {
    use ezcReflectionReturnInfo;
    /* ... */
}

class ezcReflectionFunction extends ReflectionFunction {
    use ezcReflectionReturnInfo;
    /* ... */
}
?>
优先级

来自当前类的成员覆盖了 trait 的方法,而 trait 则覆盖了被继承的方法。

多个trait

通过逗号分隔,在 use 声明列出多个 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 组成
上一篇 下一篇

猜你喜欢

热点阅读