От автора: в прошлой статье мы с Вами рассмотрели один из трех основных принципов объектно-ориентированного подхода – наследование и, конечно же, стоит изучить оставшиеся два, так как без их понимания, невозможно создать полноценный, гибкий и расширяемый проект. Но перед этим давайте рассмотрим, какие виды классов, мы можем использовать при формировании структуры будущего приложения.
Напомню, что класс ООП на PHP – это чертеж, или шаблон для формирования будущего объекта, в котором описаны постоянные или переменные хранящиеся данные, а также действия, то есть функции, именуемые методами, которые он может выполнять. Мы с Вами об этом уже говорили, и Вы знаете, как создаются простые классы. Помимо этого я кратко вспоминал, что существуют так называемые абстрактные классы в ООП PHP. А значит, давайте более подробно их изучим.
Абстрактным классом в объектно-ориентированном программировании на PHP является класс, для которого, невозможно создать объект. Они были введены в язык PHP , начиная с версии 5 и, конечно же, сразу возникает вопрос – для чего нужен класс подобного рода? Ответ достаточно прост — абстрактные классы, как правило, создаются в качестве родительских, то есть в создаваемых проектах они наследуются другими классами и, по сути, определяют интерфейс доступа к классам, которые будут их расширять.
Для создания абстрактного класса необходимо прописывать специальное слово abstract.
1 2 3 4 5 6 7 8 9 10 |
<?php abstract class Page { public $title; public function render_page() { return $this->getPage($this->title); } abstract public function getPage($title); } |
Как видите абстрактные классы ООП подхода на PHP, практически ни чем не отличаются от обычных классов, которые мы с Вами рассматривали ранее. Вы все так же вправе создавать методы и свойства, но попытка реализации объекта, сразу же приведет к ошибке.
1 |
$obj = new Page(); |
Как правило, абстрактный класс в объектно-ориентированном программировании на PHP, содержит, минимум один метод, объявленный как абстрактный. И сейчас мы с Вами подошли к еще одному новому понятию.
Абстрактный метод класса – это метод без реализации, то есть без кода, а значит и без функционала в абстрактном классе. Данный тип метода объявляется так же с использованием ключевого слова abstract и гарантирует, что его реализация обязательно будет в дочерних классах. То есть все классы наследники должны переопределить вышеуказанный метод.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
abstract class Page { public $title; public function render_page() { return $this->getPage($this->title); } abstract public function getPage($title); } class IndexPage extends Page{ public function __construct($title) { $this->title = $title; } public function getPage($title) { return $this->title; } } class NewsPage extends Page{ public function __construct($title) { $this->title = $title; } public function getPage($title) { return '<h2>'.$this->title.'</h2>'; } } $obj = new IndexPage('Главная'); echo $obj->render_page(); |
Таким образом, все наследники класса Page, обязательно должны переопределить метод getPage(), то есть задать его функционал иначе будет ошибка. Обратите внимание, что переопределяя абстрактный метод, Вы не можете изменить его структуру, то есть Вы обязательно должны использовать тот же спецификатор доступа и заданный набор аргументов, так как это определено изначально в абстрактном классе. Опять же повторюсь, Вы должны прописать только функционал в дочернем методе, а структура его четко прописана в родителе.
В примере выше, создано два класса наследника, для различных страниц будущего проекта и каждый из них наследует один и тот же абстрактный класс и каждый описывает собственный функционал метода getPage($title). Таким образом, абсолютно не важно, какой функционал предусматривает класс наследник главное, что он реализует функционал абстрактного метода.
Таким образом, абстрактные классы объектно-ориентированного подхода на PHP, допускают реализацию своих методов, но есть еще один вид классов, отличие которых заключается в том, что они вообще не допускают реализацию методов. Данные элементы называются – интерфейсами.
Интерфейс — описывает некий функционал, но никогда не реализует его. Для создания интерфейса, применяется конструкция interface.
1 2 3 4 |
interface IPage { public function render_page(); } |
При этом говорят, что классы не наследуют интерфейс, а реализуют его, то есть реализуют описанный в нем функционал. Для этого, при объявлении класса необходимо указывать зарезервированное слово implements.
1 2 3 4 5 6 7 8 9 10 |
interface IPage { public function render_page(); } class Page implements Ipage { public function render_page() { return "Hello World"; } } |
Соответственно, каждый класс, реализующий определенный интерфейс, должен обязательно реализовать его методы, а значит опять же не важно, какие классы будут создаваться в качестве реализаторов конкретного интерфейса, и какой функционал они будут описывать. Главное, что доступ к этому функционалу задает интерфейс в виде методов, которые подлежат переопределению (реализации).
При этом хотел бы отметить, что в PHP поддерживается только одиночное наследование – то есть при создании класса Вы можете наследовать только один родительский элемент. Но, вот что касается реализации интерфейсов, здесь ситуация прямо противоположная. То есть один класс может реализовать сколько угодно интерфейсов.
1 2 3 4 5 |
class Page implements Ipage,IPag2,IPage3 { public function render_page() { return "Hello World"; } } |
Так же ни кто не запрещает наследовать конкретный класс и реализовывать некий набор интерфейсов, при этом специальное слово extends, обязательно должно использоваться перед – implements.
1 2 3 4 5 |
class Page extends Basepage implements Ipage,IPag2,IPage3 { public function render_page() { return "Hello World"; } } |
На этом данная статья завершена. Более подробно вышеуказанные виды классов рассмотрены в курсе Курс по объектно-ориентированному программированию (ООП PHP). Всего Вам доброго и удачного кодирования!!!