Trait特性

2018-08-22  本文已影响0人  幽思片羽

PHP5.4以后实现了一个新的代码复用的方法Trait,Trait为了减少单继承语言的限制,相对于传统继承增加了水平特性的组合,也就是说几个class之间不需要继承。

Trait不是类,不能被实例化,Trait中的代码可以使用use直接导入到类中,相当于把trait的代码复制到当前类中。

实例:

<?php
trait play
{
    public function football()
    {
        return 'trait foot ball';
    }
}

class sport
{
    // 使用use关键字使用trait play中的代码
    use play;
}
$o = new sport;
$o->football();

一、优先级

从基类继承的成员会被trait插入的成员覆盖,优先顺序:当前类成员 > trait类成员 > 基类成员

二、使用多个Trait

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

<?php
trait playBall
{
    public function football(){}
}

trait playTools
{
    public function piano(){}
}

class sport extends ball
{
    use playBall, playTools;
}

三、冲突的解决

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

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

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

也不会影响其方法。

<?php
trait playBall
{
    public function football(){}
}

trait playTools
{
    public function football(){}
}

class sport
{
    use playBall, playTools {
        // 用playTools中的football方法替换掉playBall中的football的方法
        playTools::football insteadof playBall;
        // 给playBall的football方法一个别名
        playBall::football as Ball;
    }
}

四、Trait与Trait的组合

Trait中也可以使用Trait,在Trait定义时可以使用一个或者多个Trait

trait playBall
{
    public function football()
    {
        return 'trait foot ball';
    }
}

trait playTools
{
    use playBall;

    public function piano()
    {
        return 'trait piano';
    }
}

另外,PHP中的use的用法:

  1. 命名空间
  2. 匿名函数
  3. Trait引用
上一篇 下一篇

猜你喜欢

热点阅读