强制实现接口的类定义常量

时间:2015-02-16 13:50:15

标签: php oop inheritance interface

我愿意强制我的类定义一个名为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 cosntant。

我一直在考虑以下选项:

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

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

实现这一目标的最简洁方法是什么?

1 个答案:

答案 0 :(得分:5)

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

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

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

您可以随时检查返回的字符串是is_string()。没有什么可以阻止某人将COMMAND设置为数字。