Интерфейсы PHP: как они могут использоваться на практике?

Начну с того, что я знаю, как работают интерфейсы PHP и как их использовать.

Мой вопрос скорее; как они становятся полезными в реальных приложениях?

Я пишу PHP уже более 3 лет и никогда не ощущал необходимости в интерфейсе. Я пишу интерфейсы больше для хорошей практики, чем для определенной цели.

Ответ 1

Я приведу пример, где я использовал интерфейсы в своем собственном реальном опыте.

Интерфейсы чрезвычайно полезны, когда вам нужно определить что-то вроде архитектуры плагина. Предположим, что ваше приложение принимает плагины для аутентификации, позволяя вашим разработчикам конечных пользователей интегрироваться со своими собственными внутренними инфраструктурами (LDAP, Shibboleth, некоторая пользовательская база данных auth). Чтобы плагин был совместим, он должен реализовать следующие методы:

validate_user()
start_user_session()
logout_user()
get_user_details()

Если он определен в интерфейсе, класс затем реализует интерфейс, гарантирующий наличие необходимых методов для совместимости с архитектурой плагина.

К сожалению, PHP не применяет возвращаемый тип методов интерфейса, поэтому вы должны просто позаботиться о том, чтобы документировать ожидаемые функции возврата ваших методов.

Ответ 2

Они не так полезны. Их основная цель, похоже, для намека на тип. Когда вы пишете два отдельных класса, реализующих один и тот же интерфейс, вы можете использовать этот интерфейс в подсказке типа для функции. Таким образом, вы знаете, что у вас есть все методы этого интерфейса, доступные в объекте, который передается в параметре.

К сожалению, PHP на самом деле не проверяет, действительно ли какие-либо вызываемые методы или свойства, вызываемые этим параметром, в этом интерфейсе, поэтому вы можете случайно использовать свойство объекта, которое недоступно в интерфейсе, вызывая потенциальные ошибки, когда объект другого типа.

В этой ситуации другие языки гораздо более строгие и позволят вам использовать только те функции, которые объявлены в интерфейсе.

Тем не менее, они удобны для этой цели и в PHP, и, возможно, эти проверки станут более строгими в будущих версиях, поэтому они становятся менее подверженными ошибкам.

Ответ 3

Проверьте стандартную библиотеку PHP (SPL)  http://php.net/manual/en/book.spl.php

Счетный и RecursiveIterator может дать вам ключ.