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


Why trait does not override method in class?

我想知道我的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"。为什么?

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

<?php
class A {
    public function foo() {
        echo "x";
    }
}
class B extends A {}
$test = new B();
$test->foo();
// result X

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

<?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方法覆盖基类方法。现在让我们在B类中创建一个foo方法

<?php
class A {
    public function foo() {
        echo "x";
    }
}
trait T {
    public function foo() {
        echo "y";
    }
}
class B extends A {
    use T;
    public function foo() {
        echo "z";
    }
}
$test = new B();
$test->foo();
// result z

从基类继承的成员被Trait插入的成员重写。优先顺序是当前类的成员覆盖Trait方法,而Trait方法又覆盖继承的方法。