Как использовать интерфейсы и магические методы в PHP

Я хочу использовать интерфейсы, но некоторые из моих реализаций полагаются на магические методы, такие как __invoke и __call. Я должен удалить сигнатуры методов, которые могут быть вызваны магически (в любой реализации) из интерфейса. Что приводит к анти-шаблону Пустой интерфейс (да, я только что сделал это).

Как вы объединяете интерфейсы и магические методы в PHP?

Ответ 1

Попросите все методы интерфейса в ваших реализациях отправить __call(). Он включает в себя много мутной работы по вырезанию и вставке, но он работает.

interface Adder {
    public function add($x, $y);
}

class Calculator implements Adder {
    public function add($x, $y) {
        return $this->__call(__FUNCTION__, func_get_args());
    }

    public function __call($method, $args) {
        ...
    }
}

По крайней мере, тело каждого метода может быть идентичным.;)