php - PHP:某些人通过在主体中专门抛出异常来“伪造”抽象方法的原因是什么?
问题描述
最近经常看到这样的代码(这个例子取自 Symfony):
protected function execute(InputInterface $input, OutputInterface $output)
{
throw new LogicException('You must override the execute() method in the concrete command class.');
}
与仅将方法标记为 相比,这里有什么好处abstract
?
对人有什么好处...
- ...图书馆作者?
- ...图书馆用户?
我已经为 Java 找到了一个类似的问题(Faking abstract methods using exceptions in Java),但这并不是很有帮助,因为它的答案是明确的猜测和意见。
解决方案
一个可能的用例是可选方法。如果将其设为抽象,则所有子类都需要实现它:
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 驱动程序不支持导出
推荐阅读
- angular - 在添加到离子框架 3+ 中的本地存储之前验证重复的数据
- android - 当功能发生代码更改时,我们可以只发布动态功能模块而不是再次发布整个应用程序吗?
- pyspark - Pyspark - groupby 按顺序连接字符串列
- python - 如何在一个模板中使用来自不同应用程序的两个模型
- client-server - 在 Vivado 中写入外设,然后输出到 LED
- django - Django admin import export - 'NoneType' 对象不可调用
- anylogic - 布尔变量可以控制状态图吗?
- javascript - 数组值的 Ramda 路径
- xamarin.forms - 好奇拍摄的条形码照片是否可以在 Xamarin 模拟器中使用
- java - 如何将此代码转换为switch语句