класс — Что такое «абстрактные» функции в PHP и когда они используются?

Я знаю, что абстрактные классы предназначены только для использования в качестве родительских классов и не могут иметь своих собственных экземпляров, но что такое абстрактные функции / методы? Каковы их использования? Когда они используются (пример)? и как работает их область (публичная, частная, защищенная)?

Используйте следующий код в качестве примера.

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

-1

Решение

Абстрактная функция — это сигнатура метода, которая определяет контракт в супер (абстрактном) классе. Этот контракт должен быть реализован любыми подклассами. Видимость реализации метода в подклассах должна быть такой же или менее ограниченной, чем у суперкласса. Пожалуйста, посмотрите на Абстракция классов — руководство по PHP.

Примечание: видимость не совпадает с областью видимости. Видимость — это скрытие данных в контексте ООП. Сфера является более общей. Речь идет о том, где (в коде) определена переменная.

2

Другие решения

Абстрактные методы теоретически используются, когда вы хотите разделить метод между наследующими экземплярами. Например, скажем, у вас есть абстрактный класс, который представляет представление, и каждый наследующий класс должен будет что-то визуализировать, вы можете определить метод в родительском абстрактном классе, и все дочерние элементы будут иметь к нему доступ:

abstract class Template {
public function render($template) {
include($template);
}
}
class SiteView extends Template {
protected $title = "default title";
}
$siteView = new SiteView();
$siteView->render('path/to/site/template.html');

Чтобы улучшить это, вы также можете использовать интерфейс и начать намеки на ваши классы:

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>
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector