Привет, All! Столкнулся со следующей проблемой. У меня есть класс - наследник абстрактного класса. В этом качестве он должен реализовывать все методы своего родителя. Но есть нюанс. Роль этого конкретного потомка - интерфейс. Все методы и данные он пропускает сквозь себя, спуская нижестоящим классам. Поэтому вместо того, чтобы морочиться с написанием кучи однотипных методов (чья задача - просто вызывать тот или иной нижестоящий класс), я написал вот такое: Код (Text): public function __call($name, $arguments) { $result = call_user_func(array($this->main, $name), $arguments); if ($result === FALSE) { $result = call_user_func(array($this->reserved, $name), $arguments); } return $result; } То бишь, вызов любого метода этого класса означает такой же вызов в нижестоящем классе (main), а если итог этого вызова неудовлетворительный, - то в резервном нижестоящем классе (reserved). При попытке выполнить этот код получаю ошибку типа: Код (Text): Fatal error: Class $foo contains abstract methods and must therefore be declared abstract or implement the remaining methods... То есть, несмотря на наличие магического метода __call, от меня требуют реализовать в потомке все абстрактные методы родителя. Можно ли как-то это обойти? Или я совершил архитектурную ошибку и делаю что-то не то?
Не объявлять абстрактные методы... И почитай, когда вызывается __call, если метод объявлен в классе, не важно, абстрактным или нет, то __call не вызывается. --- Добавлено --- Для таких вещей, вообще, есть трейты (хотя их и не любят поборники чистого ООП).
@Valick, всё относительно. Один задачи прекрасно решаются обращением к ActiveRecord прямо в контроллере, а для других нужно городить огороды всяких декораторов, композитов и прочего. Чем сложнее задача, тем чище ООП. Моё мнение - надо знать, как правильно, и знать, что "делаю неправильно, но тут решается тремя строчками, посему сойдёт" --- Добавлено --- Лично я трейты пользую. Ну и то, что Laravel - это трейт на трейте и трейтом погоняет, говорит о том, что не один я не вижу в них ничего плохого.