【问题标题】:What is the proper way of using two traits mutually相互使用两个特征的正确方法是什么
【发布时间】:2021-02-05 11:44:33
【问题描述】:

最近遇到一个错误,经过很长时间的调试,原来是使用两个trait相互导致了错误。

例如:

namespace App\Traits;

use App\Traits\Transactions;

trait Reports
{
   use Transactions;
}
namespace App\Traits;

use App\Traits\Reports;

trait Transactions
{
   use Reports;
}

就我而言,我收到以下错误:

Symfony\Component\ErrorHandler\Error\FatalError
Trait "App\Traits\Transactions" not found

File: App\Trais\Reports

互用traits的方式是什么?

【问题讨论】:

  • 文件名拼写错误?应用\Trais\报告
  • 另外,如果特征是同一 namespace 的一部分,则不需要 use 语句
  • 特征相互依赖看起来像是一个设计问题,试着弄清楚你想用它们做什么,看看是否有更合乎逻辑的解决方案。
  • @gskema 我没有复制和粘贴它们,所以这里只有错字。

标签: php oop


【解决方案1】:

您想使用trait Transactions 使用trait Reports 使用trait Transactions 使用trait Reports 使用trait Transactions 使用...

该循环导致trait Reports 无法加载trait Transactions 的错误,因此您有错误。你不能这样做。

首先,你需要考虑为什么你需要 trait A using B using A...

就像你看到的那样,trait A 正好是 trait B,反之亦然(因为特征 A 使用 B,而 B 使用 A)即使它们都有其他方法,假设 trait AA::A()方法,而BB::B() 方法,所以如果他们使用你自己,他们都有A()B() 方法,所以你不需要两个特征,因为它完全一样。

但您有时可能只想使用A() 方法,否则只使用B() 方法,因此您可以像这样分开:

namespace App\Traits;

trait AB
{
    use A, B;
}

trait A
{
   function a() {}
}

trait B
{
   function b() {}
}

如果特征是同一 namespace 的一部分,您也不需要 use 语句

【讨论】:

  • 如果我做与 Report 相关的事情,它会点击 ReportController,它使用 ReportTrait,它需要来自 TransactionTrait 的函数。如果我做一些与 Transaction 相关的事情,它会点击 TransactionController,它使用 TransactionTrait,它需要 ReportTrait 中的一个函数。
  • 不可能使用 Trait A 使用 Trait B 使用 Trait C ... 使用 Trait Z 再次使用 Trait A,因为这样就永远不会加载 Trait B。 (3v4l.org/VBnT8)
猜你喜欢
  • 1970-01-01
  • 2013-11-29
  • 2016-12-04
  • 2020-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-23
  • 2023-02-03
相关资源
最近更新 更多