Як зазначалося, інтерфейси можуть визначати лише загальнодоступні методи. Я хотів показати приклад того, як можна обробляти захищені методи. Щоб нав'язати використання конкретних захищених методів, можна створити абстрактний клас, який реалізує інтерфейс.
Це особливо має сенс, якщо абстрактний клас вже може обробляти частину робочого навантаження, щоб спростити фактичну реалізацію. Ось, наприклад, абстрактний клас дбає про створення об'єкта результату, який завжди необхідний:
По-перше, інтерфейс.
interface iService
{
public function doSomething();
}
Потім абстрактний клас визначає внутрішню структуру методів:
abstract class AbstractService implements iService
{
public function doSomething()
{
$result = new ServiceResult();
$this->process($result);
return $result;
}
abstract protected function process($result);
}
Клас, який виконує фактичну реалізацію, автоматично успадковує інтерфейс від абстрактного класу і потребує лише реалізації захищеного методу.
class ExampleService extends AbstractService
{
protected function process($result)
{
$result->setSuccess('All done');
}
}
Таким чином інтерфейс виконує державний контракт, а через AbstractService
клас виконується внутрішній контракт. Програмі потрібно лише забезпечити використання AbstractService
класу там, де це можливо.