首页 > 解决方案 > PHP:某些人通过在主体中专门抛出异常来“伪造”抽象方法的原因是什么?

问题描述

最近经常看到这样的代码(这个例子取自 Symfony):

protected function execute(InputInterface $input, OutputInterface $output)
{
    throw new LogicException('You must override the execute() method in the concrete command class.');
}

与仅将方法标记为 相比,这里有什么好处abstract

对人有什么好处...

  1. ...图书馆作者?
  2. ...图书馆用户?

我已经为 Java 找到了一个类似的问题(Faking abstract methods using exceptions in Java),但这并不是很有帮助,因为它的答案是明确的猜测和意见。

标签: phpsymfonyexceptionabstract

解决方案


一个可能的用例是可选方法。如果将其设为抽象,则所有子类都需要实现它:

abstract class Database
{
    abstract public function export();
}

class MySQL extends Database
{
}

致命错误:MySQL 类包含 1 个抽象方法,因此必须声明为抽象方法或实现其余方法(Database::export)

如果您创建一个常规方法,那么子类只需要在计划支持该方法的情况下实现该方法。

abstract class Database
{
    public function export(){
        throw new \LogicException(__CLASS__ . ' driver does not support ' . __FUNCTION__);
    }
}

class MySQL extends Database
{
}

...但是,如果您尝试使用它,您会得到一个很好的错误:

$s = new MySQL();
$s->export();

致命错误:未捕获的异常“LogicException”:MySQL 驱动程序不支持导出


推荐阅读