【发布时间】:2014-09-20 05:34:55
【问题描述】:
Stack Overflow 上的一些人认为这可能是一个好的实现吗?
例如,我有一个名为 RequestInterface 的接口,它有 5 个常量:
interface RequestInterface {
const GET = 1;
const POST = 2;
const PUT = 3;
const DELETE = 4;
const HEAD = 5;
public function getType();
// ... some other methods declarations
}
然后对于每个常量都有一个实现该接口的类,例如PostRequest:
class PostRequest implements RequestInterface {
public function getType() {
return RequestInterface::POST
}
}
PUT 请求:
class PutRequest implements RequestInterface {
public function getType() {
return RequestInterface::PUT
}
}
对于其他类也是如此。
我知道在接口中使用常量被某些人认为是反模式,但是您对我所做的示例有何看法?对于这种情况,还有什么可能更好的解决方案?
编辑:@pid 你建议我使用 get_class() 或 is_a() 函数,例如如果我有另一个使用该 RequestInterface 的类,我可以摆脱这些常量并简单地使用 instanceof 来确定 RequestInterface 的类型?
// inside another class which uses a RequestInterface
public function someMethod(RequestInterface $request) {
if ($request instanceof PostRequest) {
// Request is a post...
}
}
【问题讨论】:
-
我不认为 static 数据 - 例如。常量 - 应该与多态性(以及扩展,接口)有关。根本没有添加任何好处(尤其是这里),而像
return HttpVerb::POST这样的东西对我来说更清楚(并且通过将静态数据从接口分离到它自己的类型/容器中来获得)。 -
类型已经通过类命名。您可以使用类名作为标识符。
-
请看这个问题,它非常适合您的问题stackoverflow.com/questions/5350672/…
-
@ins0 是的,这是一个非常相似的问题,但在我看来,在这种情况下,没有人提出可能的解决方法或可能的替代方案......你怎么看?
-
@user2864740 所以你是说你会创建另一种类型,例如包含这些常量的 HttpVerb 抽象类或接口,然后在 RequestInterface 实现中使用它们?