Интерфейсы в php
В продолжении темы объектно-ориентированного программирования, начатой в предыдущей статье Абстрактные классы в php рассмотрим интерфейсы.
Представьте, что некоторые классы могут взаимодействовать друг с другом. Например, класс Smithy (кузница) мог бы принимать и ремонтировать броню и оружие.
Однако отремонтировать лук для эльфа не то же самое, что отремонтировать двуручный топор для гнома. Поэтому мы не можем создать родительский класс Equipment (снаряжение), поместить в него реализации методов repairWeapon() и repairArmor(), а затем наследовать от него классы конкретных типов снаряжения. Для каждого типа снаряжения нужен свой программный код.
В PHP специально для этих целей существуют интерфейсы классов. Это целая концепция, и возможно с первого взгляда не понятная. Интерфейс — это контракт на выполнение действий между классом, реализующим интерфейс, и тем, кто его использует.
Классу Smithy все равно, с какой экипировкой взаимодействовать, лишь бы у него были методы repairWeapon() и repairArmor(). Их отсутствие вызовет фатальную ошибку при первой попытке вызова. Если же классы конкретных типов снаряжения реализуют интерфейс, то он обязывает их иметь соответствующие методы.
Определение интерфейса
В PHP определение интерфейса происходит аналогично обычному классу, с заменой ключевого слова `class` на `interface`. Выражение в общем виде можно записать как `interface ИмяИнтерфейса {/* определение методов */}`.
Правила определения интерфейсов:
- Он имеет только поведение, поэтому не допускается добавление свойств.
- Все методы должны быть открытыми и иметь модификатор public.
- Методы не должны иметь реализации. В их определение входит только модификатор доступа public, имя и список параметров. Сразу за круглыми скобками параметров находится точка с запятой.
Нарушение любого из правил, приведенных выше, вызовет фатальную ошибку и прекращение выполнения программы.
//Определение интерфейса "кузница"
interface Smithy
{
//Определение методов интерфейса
public function repairWeapon();
public function repairArmor();
}
Реализация интерфейса
Чтобы PHP интерпретатор узнал о связи класса с интерфейсом нужно использовать ключевое слово `implements`. Выражение можно записать как `class ИмяКласса implements ИмяИнтерфейса {/* определение свойств и методов */}`. Допустимо указание нескольких интерфейсов через запятую.
После создания связи, необходимо добавить реализации требуемых методов. Они могут быть пустыми. Обязательными условиями являются:
- модификатор доступа public
- полное совпадение имени и списка параметров метода. Если метод, указанный в интерфейсе, определяет три параметра, а в классе указано только два, программный код завершится с ошибкой
//Интерфейс "кузница"
interface Smithy
{
public function repairWeapon();
public function repairArmor();
}
//Класс "Орк" реализующий интерфейс
class Orc implements Smithy
{
public function repairWeapon(){
echo "Точим двуручный меч";
}
public function repairArmor(){
echo "Меняем поврежденные элементы кольчуги";
}
}
Важлива інформація
України
втрати противника
орієнтовно склали: