我知道抽象类只是用于父类,不能有自己的实例,但什么是抽象函数/方法?它们的用途是什么?他们什么时候使用(例子)?他们的范围(公共,私人,受保护)如何运作?
使用以下代码作为示例。
abstract class parentTest{
//abstract protected function f1();
//abstract public function f2();
//abstract private function f3();
}
class childTest extends parentTest{
public function f1(){
echo "This is the 'f1' function.<br />";
}
public function f2(){
echo "This is the 'f2' function.<br />";
}
protected function f3(){
echo "This is the 'f3' function.<br />";
}
}
$foo = new childTest();
$foo->f1();
答案 0 :(得分:2)
抽象函数是一种方法签名,用于定义超(抽象)类中的契约。该合同必须由任何子类实现。方法实现在子类中的可见性必须与超类的可见性相同或限制性更小。请看一下Class Abstraction - PHP Manual。
注意:可见性与范围不同。可见性是关于OOP上下文中的数据隐藏。范围更广泛。它是关于定义变量的位置(在代码中)。
答案 1 :(得分:0)
当您想要在继承实例之间共享方法时,理论上会使用抽象方法。例如,假设您有一个表示视图的抽象类,并且每个继承类都必须呈现某些内容,您可以在父抽象类中定义该方法,并且所有子项都可以访问它:
interface Renderer {
public function render($template);
}
abstract class Template implements Renderer {
public function render($template) {
include($template);
}
}
class SiteView extends Template {
protected $title = "default title";
protected $body= "default body";
}
class Controller {
private $view;
public function __construct(Renderer $view) {
$this->view = $view;
}
public function show() {
$this->view->render('path/to/site/template.html');
}
}
$siteView = new SiteView();
$controller = new Controller($siteView);
$controller->show();
为了改善这一点,您还可以使用界面并开始对类进行类型提示:
<!DOCTYPE html>
<html>
<head>
<title><?= $this->title ?></title>
</head>
<body><?= $this->body ?></body>
</html>
注意控制器之后如何与抽象和具体类分离,而抽象类允许您与继承视图共享渲染功能。如果您决定创建表示其他渲染方式的其他抽象类,控制器将继续工作。
对于记录,模板看起来像:
variable