Если вы понимаете, почему вы используете их на других языках, те же понятия применимы и к PHP.Интерфейсы класса "подписи" ... они не содержат кода.Абстрактные классы не могут быть созданы, но они могут содержать как реализованные, так и абстрактные (пустые) функции.
Обратите внимание, что класс может расширять только один родительский класс (или абстрактный класс), но он может реализовать столько интерфейсов, сколькоэто необходимо.
Но, учитывая, что PHP не имеет строгой типизации и не имеет концепции проверок времени компиляции, вы можете обычно обходиться без них, в отличие от языков, таких как C ++ или Java.
Ядро PHP требует интерфейсов для некоторых вещей.Например:
class Foo implements Countable
{
public function count()
{
return 5;
}
}
echo count(new Foo()); // returns 5
Если вы удалите «Implements Countable», PHP не будет вызывать ваш метод count
.Есть много других интерфейсов, которые вы можете реализовать, что позволяет всем пользовательским объектам вести себя одинаково.Например, вы можете создать объект, который работает с итерацией * 1013. *
Интерфейсы на уровне пользователя не очень полезны в PHP, как я уже упоминал ранее.Но если вы используете подсказки типа, они могут быть:
function foo(MyInterface $bar)
{
$bar->someMethod();
}
Если предположить, что someMethod
объявлено в MyInterface
, тогда вы гарантированно, что вызов $bar->someMethod()
существует.(Причина, по которой это не так полезно в PHP, как в других языках, заключается в том, что подсказка типа в сигнатуре функции не будет проверяться до времени выполнения.)
Пустые интерфейсы также могут быть полезны, так какспособы категоризации классов.Скажем, вы хотите сделать что-то для определенного набора объектов.Все они могут реализовать какой-то пустой интерфейс.Тогда ваш код может просто проверить этот интерфейс, даже не зная ничего об объекте.
interface Red {}
class Foo implements Red { }
$foo = new Foo();
if ($foo instanceof Red)
{
// do something
}
Абстрактные классы полезны, когда у вас есть много кода, который разделяется между подклассами, но незначимый сам по себе.Вы можете объявить базовый класс как абстрактный, реализовать все совместно используемые функции и оставить остальные функции пустыми.Объявив этот базовый класс абстрактным, никто никогда не сможет использовать его сам по себе.