什么是PHP中的“抽象”函数以及它们何时使用?

时间:2015-12-09 17:49:42

标签: php class oop extend

我知道抽象类只是用于父类,不能有自己的实例,但什么是抽象函数/方法?它们的用途是什么?他们什么时候使用(例子)?他们的范围(公共,私人,受保护)如何运作?

使用以下代码作为示例。

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();

2 个答案:

答案 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