我在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");
}
}
答案 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
。这就是为什么你必须将它们彼此区分开来的原因。
答案 1 :(得分:1)
该方法不是来自MyInterface
,而是来自HomeController
。
原因是因为HomeController
从特征MyTrait
获取方法,但随后覆盖它。
如果您想在特征中使用该方法,则无需声明接口。
什么接口强制实现它的类声明这些方法,但是你不想这样做,因为你在Trait中创建方法..