一、介绍

PHP5.4起,PHP新增了trait新特性,实现了一种代码复用的方法。

PHP是单继承的语言,为了避免多继承问题,通过trait和class的组合实现代码的复用。

二、解决多个trait冲突

解决方法

  1. insteadof关键字
  2. 别名
<?php
trait T
{
    public function m1()
    {
        return 'm1';
    }
    public function m2()
    {
        return 'm2';
    }
}

trait T2
{
    public function m1()
    {
        return 'm3';
    }
}

class Demo
{
    use T, T2{
        T::m1 insteadof T2; // 方式1:优先使用T的m1
        T2::m1 as new_m1;   // 方式2:使用别名的方式
    }
    public function test()
    {
        return 'test';
    }
}
$demo = new Demo;
echo $demo->m1(), PHP_EOL;
echo $demo->new_m1(), PHP_EOL;
echo $demo->test(), PHP_EOL;

三、改变权限

<?php
trait T
{
    public function m1()
    {
        return 'm1';
    }
}

class Demo
{
    use T{
        m1 as protected; // 把public改为protected权限
    }
    public function test()
    {
        return 'test';
    }
}
$demo = new Demo;
echo $demo->m1(), PHP_EOL; // 保护方法,无法访问