【问题标题】:PHP Interfaces and namespacesPHP 接口和命名空间
【发布时间】:2018-03-03 13:18:34
【问题描述】:

在开发包或应用程序时,是否存在最佳实践、FIG 标准或社区对在何处放置类接口以考虑命名空间的共识?

例如我们应该:

  • App\CarInterface
  • App\Cars\Ford
  • App\Cars\Toyota
  • App\Cars\Tesla

或者我们应该:

  • App\Cars\CarInterface
  • App\Cars\Ford
  • App\Cars\Toyota
  • App\Cars\Tesla

我问的是接口是否应该放在与其实现相同的命名空间中。

【问题讨论】:

  • 类名应该来自项目中使用的概念。接口和命名空间也是如此。您的应用程序的所有类都位于App 命名空间中吗?
  • 在这种情况下我喜欢做的是第二个选项,但不是CarInterface,我只是将其命名为Car。然后你使用接口声明依赖,并根据需要传递实现
  • @axiac 我不明白你的意思?我在问接口是否应该放在与其实现相同的命名空间中......
  • 我无法在愚蠢的 5 分钟时间限制内正确编辑我之前的答案。我不知道这些实际上是PSR naming conventions,如下面的另一个答案中所述,所以请忽略我在 Symfony 上的注释。使用 *Interface 为接口名称添加后缀似乎是 Symfony 遵循的 PHP-FIG 标准。并不意味着您必须遵循,但有助于保持一致。

标签: php laravel design-patterns interface fig


【解决方案1】:

在Illuminate的情况下,所有接口都在illuminate/contracts/<<FunctionGroup>>/<<BarInterface>>

但是,如果您认为维护/查找相关界面会更困难,请选择第二个选项。我看到很多项目都是这样组织的(包括我的)。

顺便说一句,来自PSR Naming Conventions

接口必须以Interface 为后缀:例如Psr\Foo\BarInterface.

【讨论】:

  • 我真的不喜欢 Illuminate 方法,它有点适用于框架。它将合约与其实现分离得如此之大,您必须深入研究一个完全不同的包/子模块才能找到它们
  • 是的,这就是为什么我更喜欢将它分组在应该实施的位置附近。并且仅将contracts 用于全球/广泛使用的接口。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-30
  • 2015-11-12
  • 1970-01-01
  • 2014-04-25
  • 1970-01-01
  • 1970-01-01
  • 2012-05-19
相关资源
最近更新 更多