为什么trait不会覆盖类中的方法?

时间:2015-02-11 12:05:47

标签: php traits

我想知道我的php解释器是否无法正常工作或者我是否理解Traits错误。这是我的代码:

<?php

trait ExampleTrait{
    public function foo()
    {
        echo 'y';
    }
}

class ExampleClass
{
    use ExampleTrait;

    public function foo()
    {
        echo 'x';
    }
}

$exCl = new ExampleClass();

$exCl->foo();

我认为这应该显示“y”,但它显示“x”。为什么呢?

1 个答案:

答案 0 :(得分:4)

仔细阅读Trait documentation我建议您尝试每个示例并进行自己的修改,以确保您理解它。有我的例子,希望它有所帮助:

start

我认为这很清楚,所以现在让我们使用Trait:

<?php
class A {
    public function foo() {
        echo "x";
    }
}

class B extends A {}

$test = new B();
$test->foo();

// result X

正如您所见,Trait方法会覆盖基类方法。现在让我们在B类中创建一个foo方法

<?php
class A {
    public function foo() {
        echo "x";
    }
}

trait T {
    public function foo() {
        echo "y";
    }
}

class B extends A {
    use T;
}

$test = new B();
$test->foo();

// result y
  

来自基类的继承成员被Trait插入的成员覆盖。优先顺序是当前类的成员覆盖Trait方法,后者又覆盖继承的方法。