如何避免在PHP中重复已实现的getter函数


How to avoid duplicating implemented getter function in PHP

虽然这个问题是关于解决这个问题的方法,但我对良好的干净OO设计和符合当前PHP最佳实践的解决方案特别感兴趣。提前感谢您的光临。

我有以下接口:

<?php
interface Tool {
  /**
   * Return the unique name of the tool
   */
  public function getName();
}

在我的项目中实现这个接口的大多数类看起来是这样的:

<?php
class Drill implements Tool {
    protected $toolName = 'drill';
    public function getName() {
        return $this->toolName;
    }
}

因此问题是我有几十个类重复这个逻辑,复制$toolName属性和getName((逻辑,打破了"不要重复自己"的简单规则

我考虑过的一个解决方案是:

<?php
abstract class BaseTool implements Tool {
    public function getName() {
        return $this->toolName;
    }
}

然后简单地让工具类扩展抽象的BaseTool类:

<?php
class Drill extends BaseTool {
    protected $toolName = 'drill';
}

然而,这现在意味着,如果实现类扩展了BaseTool类,我将失去强制它们定义函数getName((的能力,这可能会导致不正确的实现。

我还认为,通过让BaseTool类返回$this->toolName,它对实现类进行了假设,并破坏了封装。

我用了一个简单的例子来演示这个问题,但希望你能理解我试图解决的问题,这个问题也可能与更复杂的情况有关。感激你的想法。

如果您使用的是PHP 5.4.0+,请查看traits!

您可以创建一个ToolInterfaceTrait,它只包含变量$toolName 的getter/setter

您的尝试看起来不错。没什么好说的了。

然而,这现在意味着,如果实现类扩展了BaseTool类,我将失去强制它们定义函数getName((的能力,这可能会导致不正确的实现。

您仍然强制它们,它们需要继承一个实现它们的类或自己实现它们。

如果所有应该实现Tool的类都从BaseTool扩展是不可行的,请随意创建更多实现getName()的基类或直接实现它,就像您希望的那样。

顺便说一句,如果你计划所有的工具都应该扩展BaseTool,那么这个接口根本就没有必要,至少对于这个用例来说没有必要。接口用于并非所有用于实现它的类都继承自同一基类的情况。

如何避免在PHP 中重复已实现的getter函数

抽象类通常用于对重复的代码进行分组。你走在正确的道路上。至于你对这个选择的怀疑。。。

然而,这现在意味着,如果实现类扩展了BaseTool类,我将失去强制它们定义函数getName((的能力,这可能会导致不正确的实现。

通过扩展BaseTool类,类继承getName()(这就是在抽象类中定义它的想法(。我不知道为什么这会导致不正确的实现,或者为什么你必须"强制实现类来定义它"。他们通过扩展抽象类来自动获得它。

我还认为,通过让BaseTool类返回$this->toolName,它对实现类进行了假设,并破坏了封装。

如果在抽象类中定义toolName,并在构造函数中设置其值,那么可能会更干净一些?

<?php
abstract class BaseTool implements Tool {
    protected $toolName;
    public function __construct($toolName)
    {
        $this->toolName = $toolName;
    }
    public function getName() {
        return $this->toolName;
    }
}

您可以在扩展类中定义一个构造函数来命名:

<?php
class Drill extends BaseTool {
    public function __construct()
    {
        parent::__construct("drill");
    }
}