【问题标题】:Force a class implementing the interface to define a constant强制实现接口的类定义一个常量
【发布时间】:2015-04-17 01:16:52
【问题描述】:

我愿意强制我的类定义一个名为 COMMAND 的常量。如果 php 允许从接口中覆盖常量,则看起来像

class RequestInterface
{
    const COMMAND = "no-command-specified";
}

class LoginRequest implements RequestInterface
{
    const COMMAND = "loginuser";
    public $username;
    public $password;
}

$request = new LoginRequest();
$request->username = "user";
$request->password = "blah";

显然这不起作用。我正在寻找一种干净的方法来使我的请求定义 COMMAND 余数。

我一直在考虑以下选项:

  • 接口定义了一个 getCommand 方法,我的请求类需要实现它并将命令名称作为字符串返回。但是每个请求的代码太多
  • 用抽象类替换接口。这看起来很奇怪,因为抽象类通常会定义至少一种方法
  • 接口成为抽象类并定义了一个受保护的变量$command。它还有一个返回 $this->command; 的 getter 方法。子级覆盖受保护的属性 $command。我不喜欢将公共变量(应该是变量)与受保护的变量混合的方式,该变量实际上不应该是可修改的,因此首先不应该是变量。

    class LoginRequest extends BaseRequest
    {
         protected $command = "loginuser";
         public $username;
         public $password;
    }
    

实现这一目标的最干净的方法是什么?

【问题讨论】:

  • 每个请求的代码太多”是什么意思?您想避免在实现类中定义接口的方法吗?我可能只会使用该选项。过去,我也使用过第二个(抽象类)选项,但我同意没有任何定义的方法是不寻常的。
  • 一个只有常量的类,你在当前类中引用的位置怎么样?这样你总是有一个恒定的中心
  • @MichaelBerkowski 我希望我的 Request 对象成为最简单的数据容器。我很欣赏这种方法似乎是最干净的,但在我看来定义一个方法似乎有点太多的代码
  • @user3790680 这种方法集中了数据,但不以任何方式强制执行
  • 我知道,但我认为执行是确保您获得正确数据的一部分。确实对强制执行没有帮助。

标签: php oop inheritance interface


【解决方案1】:

就个人而言,我的选择是:

interface RequestInterface
{
    /**
     * @returns string
     */
    public function getCommand();
}

class LoginRequest implements RequestInterface
{
    public function getCommand() {
        return "loginuser";
    }
   ...
}

您可以随时检查是否返回了带有is_string() 的字符串。无论如何,没有什么可以阻止有人将 COMMAND 设置为数字。

【讨论】:

  • 如果你想将其用作序列化对象,请查看JsonSerializable 接口。然后,您可以定义返回的数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-08
  • 1970-01-01
  • 1970-01-01
  • 2013-02-19
  • 1970-01-01
相关资源
最近更新 更多