Php 使用标记接口的安全编程与Liskov替换原则
我知道LSP以及以下代码给出的原因: PHP致命错误:声明 UnauthenticatedUser::executeCommand(UnauthenticatedCommand$c)必须为 与上/tmp/test.php中的User::executeCommand(命令$c)兼容 第13行 然而,我认为这两个接口Php 使用标记接口的安全编程与Liskov替换原则,php,oop,Php,Oop,我知道LSP以及以下代码给出的原因: PHP致命错误:声明 UnauthenticatedUser::executeCommand(UnauthenticatedCommand$c)必须为 与上/tmp/test.php中的User::executeCommand(命令$c)兼容 第13行 然而,我认为这两个接口Command和UnauthenticatedCommand是等价的(因为它们只是标记接口) 鉴于这些事实,有什么干净的[1]方法可以让未经身份验证的用户不可能执行除未经身份验证的命令以
Command
和UnauthenticatedCommand
是等价的(因为它们只是标记接口)
鉴于这些事实,有什么干净的[1]方法可以让未经身份验证的用户不可能执行除未经身份验证的命令以外的任何其他命令
<?php
interface Command {
}
interface UnauthenticatedCommand extends Command {
}
interface User {
public function executeCommand(Command $c);
}
class UnauthenticatedUser implements User {
public function executeCommand(UnauthenticatedCommand $c) {
}
}
虽然您的推理不是特别不合理,但PHP并不支持这种推理。最好是在命令
界面上提示,然后在方法体中添加一个额外的instanceof
约束。@Sammitch如果能得到您的注释作为答案,对我们所有人都是非常好和有益的。假设PHP允许您在编写类时声明它们。(新的未经身份验证的用户())->如何执行(新的InasceofCommand())
工作InAsceofCommand
没有执行Unauthenticated命令
@mleko它将抛出一个可丢弃的命令,并以紧急级别记录。@Flavius所以您希望它是TypeError
?