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

Method with same name called from Interface not from Trait?

我在 MyInterface.phpMyTrait.php 中创建了相同的方法 printData(),我正在从实现 MyInterface.php 的控制器中调用方法 printData()并使用 MyTrait.php。但是该方法总是从 MyInterface.php 调用。请解释为什么会这样?

MyInterface.php

<?php namespace App\Interfaces;

interface MyInterface
{
    public function printData();
}

MyTrait.php

<?php namespace App\Traits;

trait MyTrait
{
    public function printData()
    {
        dd("From Trait");
    }
}

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");
    }
}

该方法不是从 MyInterface 调用,而是从 HomeController 调用。

原因是因为 HomeController 从 trait MyTrait 获取方法,然后覆盖它。

如果你想在你的特征中使用那个方法,你不需要声明一个接口。

接口的作用是强制实现它的 类 声明这些方法,但您不想这样做,因为您是在 Trait 中创建方法..

试试这样使用它:

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

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

    public function printData()
    {

        dd("From Interface");
    }
}

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

Horizontal Reuse for PHP

中了解更多相关信息