Интерфейсы чем-то похожи на абстрактные классы. Однако есть существенные различия. Как известно, абстрактный класс позволяет свободно создавать свойства и методы, как в обычном классе. Также в нем можно прописать пустые методы объявленные абстрактными (шаблоны). В интерфейсе вы сможете только перечислить список методов, которые обязательно должны присутствовать в классе, который его подключает.
Таким образом интерфейс - это чистой воды шаблон, список обязательных методов, которым должен обладать класс.
Важные замечания по интерфейсам.
- Интерфейс может содержать только объявления методов с уровнем доступа public, но не тела этих методов. Также интерфейсы работают с константами.
- Любой класс подключенный к интерфейсу обязательно должен реализовать все его методы. Это правило можно обойти если подключать абстрактный класс к интерфейсу
- Интерфейсы могут наследовать друг друга за счет extends
- Класс может одновременно расширять суперкласс и подключать к себе интерфейсы
Посмотрите на этот пример:
//создали интерфейс за счет interface и определили обязательный метод boldread()
interface GShop {
public function boldread($str);
}
//подцепили класс к интерфейсу за счет implements и реализовали обязательный метод boldread()
class GPhone implements GShop {
function boldread($str) {return '<b>'.$str.'</b>';}
}
//вывели значение
$GPhone = new GPhone;
echo $GPhone->boldread('Текст');
Из комментариев ясно, что для создания интерфейсов достаточно использовать команду interface. А для подключения класса к нему - implements.
Если же вы хотите расширить суперкласс и подключить несколько интерфесов, то пишите так: class Toyota extends Auto implements Type, Price {}
Давайте рассмотрим еще один пример, в котром интерфейсы наследуют друг друга:
//создали интерфейс Tapok
interface Tapok {
public function cenatapok($str);
}
//создали интерфейс Sapog и наследовали методы от интерфейса Tapok. Если бы был еще интерфейс Tyfli, то можно было бы подключиться и к нему так: interface Sapog extends Tapok, Tyfli {}
interface Sapog extends Tapok {
public function cenasapog($str);
}
//подцепили класс к интерфейсу Sapog и автоматом к Tapok
//теперь обязаны реализовать оба метода cenatapok() и cenasapog()
class MyObyv implements Sapog {
function cenatapok($str) {return $str;}
function cenasapog($str) {return $str;}
}
Интерфейсы могут служить "обязательными полями", чтобы программист знал, какие методы требует от него программа.
Когда использовать интерфейсы, а когда абстрактные классы?
Если у вас есть магазин, то абстрактный класс может описать свойства товаров: цвет, форму, цену, а действия можно доверить интерфесу, например, купить, продать, доставить товар.
Добавить комментарий