从Interface而不是Trait调用同名方法?

RAU*_*MAR 0 php interface traits laravel

printData()MyInterface.php和中创建了相同的方法,MyTrait.phpprintData()从我的控制器调用方法来实现MyInterface.php和使用MyTrait.php.但是这个方法总是来自MyInterface.php.请解释一下为什么会这样?

MyInterface.php

<?php namespace App\Interfaces;

interface MyInterface
{
    public function printData();
}
Run Code Online (Sandbox Code Playgroud)

MyTrait.php

<?php namespace App\Traits;

trait MyTrait
{
    public function printData()
    {
        dd("From Trait");
    }
}
Run Code Online (Sandbox Code Playgroud)

HomeController.php

<?php namespace App\Http\Controllers;

use App\Interfaces\MyInterface;
use App\Traits\MyTrait;
use App\User;

class HomeController extends Controller implements MyInterface
{
    use MyTrait;

    public function index()
    {
        $this->printData();
    }

    public function printData() {
        // TODO: Implement printData() method.
        dd("From Interface");
    }
}
Run Code Online (Sandbox Code Playgroud)

meg*_*382 5

尝试使用它像这样:

class HomeController extends Controller implements MyInterface
{
    use MyTrait{
        printData as MyTraitPrintData;
    }

    public function index()
    {
        $this->MyTraitPrintData();
    }

    public function printData()
    {

        dd("From Interface");
    }
}
Run Code Online (Sandbox Code Playgroud)

特征旨在提供reusable方法和属性.它们不会覆盖类自己的方法.通过printData()在内部定义,HomeController你实际上是在覆盖printData()内部MyTrait.这就是为什么你必须将它们彼此区分开来的原因.

PHP的Horizo​​ntal Reuse中了解有关所有这些的更多信息