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

时间:2017-10-30 12:35:33

标签: php laravel interface traits

我在printData()MyInterface.php中创建了相同的方法MyTrait.php,我从我的控制器调用方法printData()来实现MyInterface.php并使用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");
    }
}

2 个答案:

答案 0 :(得分:5)

尝试使用它:

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

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

    public function printData()
    {

        dd("From Interface");
    }
}

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

Horizontal Reuse for PHP

中详细了解所有这些内容

答案 1 :(得分:1)

该方法不是来自MyInterface,而是来自HomeController

原因是因为HomeController从特征MyTrait获取方法,但随后覆盖它。

如果您想在特征中使用该方法,则无需声明接口。

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