从 Interface 而不是 Trait 调用的同名方法?
Method with same name called from Interface not from Trait?
我在 MyInterface.php
和 MyTrait.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()
。这就是为什么你必须将它们彼此区分开来。
中了解更多相关信息
我在 MyInterface.php
和 MyTrait.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()
。这就是为什么你必须将它们彼此区分开来。