我有一个下面的程序
<?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 Vehicle
、class 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文件)。