使用Trait、接口或者两者都使用


Use Trait, Interfaces or both?

我有一个关于在PHP中使用Trait和接口的问题。

带有foobar函数的trait

<?php
trait FoobarTrait
{
  protected $foobar;
  public function setFoobar($foobar)
  {
    $this->foobar = $foobar
  }
  public function getFoobar()
  {
    return $this->foobar;
  }
}

指定如何使用Trait的特定接口

<?php
interface FoobarInterface
{
    public function setFoobar($foobar);
    public function getFoobar();
}

我想在类中使用foobar功能。什么是最好的方法?

有必要用一个接口和指定的trait来实现还是它是一个诱导行为?

<?php
  class FoobarClass implements FoobarInterface
  {
    use FoobarTrait;
  }

<?php
  class FoobarClass
  {
    use FoobarTrait;
  }

感谢您的回复和讨论;)

正如@Federkun在评论中正确指出的那样,"视情况而定"。在我看来,主要是关于你如何使用你的FoobarClass

  • 如果它是某种服务的实现,可以根据外部条件有多个实现(例如,考虑文件系统或S3处理用户上传),我会使用FooBarInterface,因为我可以在使用该服务的其他地方键入提示。

  • 如果你只是想避免重复自己,你可以使用trait而不使用接口。或者甚至一个基本的abstract class AbstractFooBar { ... }来封装重复的代码。

  • 如果你只有一个实现来获取和设置$fooBar -只要把它都放在同一个类:)

相关文章: