Абстрактные классы и методы

До сих пор мы употребляли термины "абстрактный класс" и "абстрактный метод", не вдаваясь в детали. Давайте посмотрим, какими основными свойствами обладают эти "абстракции".

· Абстрактный метод нельзя вызвать, если он не был переопределен в производном классе. Собственно, написав функцию cached::id() и поместив в нее вызов die(), мы как раз и гарантируем, что она обязательно будет переопределена в производном классе (иначе получим ошибку во время выполнения программы).

· Объект абстрактного класса, очевидно, невозможно создать. Действительно, представьте, что мы записали оператор: $obj = new Page(). Что при этом должно произойти? Ведь страница не знает, как себя извлечь из базы данных - об этом заботятся производные классы.

· Любой класс, содержащий хотя бы один абстрактный метод, сам является абстрактным. Действительно, если предположить, что кто-нибудь создаст объект этого класса и случайно вызовет абстрактный метод, получим ошибку.

Специально для того, чтобы автоматически учесть эти особенности, в РНР предусмотрено ключевое слово - модификатор abstract. Вы можете объявить класс или метод как abstract, и тогда контроль за их некорректным использованием возьмет на себя сам РНР.

Абстрактные классы можно использовать только для одной цели: создавать от них производные. В листинге 16 приведен все тот же самый класс Page, но только теперь мы используем ключевое слово abstract там, где это необходимо по логике.

Листинг 16 Абстрактный класс страницы. Файлы pages/PageA.php

Класс Cached тоже можно переписать с использованием ключевого слова abstract. В отличие от класса Page в нем мы определяем абстрактный метод id(). В листинге 17 содержимое класса приводится в сокращенном варианте.

Листинг 17 Абстрактный класс кешированной страницы. Файлы pages/CachedA.php

Как видите, при объявлении абстрактного метода (например, id())вы уже не должны определять его тело - просто поставьте точку с запятой после его прототипа.

Если вы случайно пропустите ключевое слово abstract в заголовке класса Cached, РНР напомнит вам об этом сообщением о фатальной ошибке.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: