强制一个 class 实现接口来定义一个常量
Force a class implementing the interface to define a constant
我愿意强迫我的 classes 定义一个名为 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方法,我的请求classes需要实现它并且return命令名称作为字符串。但是每个请求的代码太多
- 用抽象替换接口 class。它看起来很奇怪,因为 abstract class 通常 通常 期望至少定义一个方法
接口变得抽象class并定义了一个受保护的变量$command。它还有一个 getter 方法 returns $this->command;。子级覆盖受保护的 属性 $ 命令。我不喜欢将 public VARIABLES(应该是可变的)与受保护的 VARIABLE 混合的方式,该 VARIABLE 实际上不应该是可修改的,因此首先不应该是变量。
class LoginRequest extends BaseRequest
{
protected $command = "loginuser";
public $username;
public $password;
}
实现此目的最干净的方法是什么?
就个人而言,我的选择是:
interface RequestInterface
{
/**
* @returns string
*/
public function getCommand();
}
class LoginRequest implements RequestInterface
{
public function getCommand() {
return "loginuser";
}
...
}
您以后可以随时检查返回的字符串 is_string()
。无论如何,没有什么可以阻止有人将 COMMAND 设置为数字。
我愿意强迫我的 classes 定义一个名为 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方法,我的请求classes需要实现它并且return命令名称作为字符串。但是每个请求的代码太多
- 用抽象替换接口 class。它看起来很奇怪,因为 abstract class 通常 通常 期望至少定义一个方法
接口变得抽象class并定义了一个受保护的变量$command。它还有一个 getter 方法 returns $this->command;。子级覆盖受保护的 属性 $ 命令。我不喜欢将 public VARIABLES(应该是可变的)与受保护的 VARIABLE 混合的方式,该 VARIABLE 实际上不应该是可修改的,因此首先不应该是变量。
class LoginRequest extends BaseRequest { protected $command = "loginuser"; public $username; public $password; }
实现此目的最干净的方法是什么?
就个人而言,我的选择是:
interface RequestInterface
{
/**
* @returns string
*/
public function getCommand();
}
class LoginRequest implements RequestInterface
{
public function getCommand() {
return "loginuser";
}
...
}
您以后可以随时检查返回的字符串 is_string()
。无论如何,没有什么可以阻止有人将 COMMAND 设置为数字。