为抽象方法声明抽象类是强制性的吗


Is it compulsory to declare abstract class for abstract method?

我有一个下面的程序

<?php
abstract class foo
{
    abstract public function callme();
    public function testing()
    {
        return $this->callme();
    }
}
class bar extends foo
{
    public function callme()
    {
        return "hello";
    }   
}
$objBar = new bar();
echo $objBar->testing();
?>

我定义了abstract class foo。课前必须写摘要吗?因为如果我删除抽象,我会得到致命的错误。

是的,如果它包含抽象方法。

通过将一个方法声明为抽象方法,就意味着为了使用这个类,扩展类必须实现抽象方法。

除非实现了callme,否则不能实例化foo类,因此必须将其声明为抽象类。


与标准的abstract class Vehicleclass Car extends Vehicle教程相比,用真实世界的示例来解释这些概念可能更好。

假设我们有一个报告系统,它对数据库进行一些查询。

我们发现,所有报告都必须以标准的方式实现,以共享代码并帮助将来进行维护。

所以我们定义:

abstract class Report 
{
}

为了便于论证,我们所有的报告都需要数据库连接。

abstract class Report 
{
    /** @var PDO */
    protected $dbh;
    public function __construct (PDO $dbh) 
    {
         $this->dbh = $dbh;
    }  
    /**
     * @return array
     */
    abstract public function getData();
}

在这里,我们还决定所有的报告都必须实现一个返回数组的公共getData方法。

这意味着:

  • 我们可以确保所有报告都有数据库连接
  • 我们可以以相同的方式实例化并运行每个报告

抽象类定义强制了我们使用这些代码的方式,并确保每种类型的报告,无论您团队中的哪位开发人员编写,都符合我们决定的惯例。

然后,其他代码可以从用户输入中选择一个报告,运行它,并在知道它将是一个数组的情况下对getData的结果进行处理(例如将它写入CSV文件)。