В том-то и дело, что интерфейсы мне вообще неинтересны (в PHP они просто не нужны, ты можешь вызывать любой метод любого класса, если он описан хоть где-то, если его нет - ошибку получишь во время исполнения).
Мне нужно, чтобы некий класс принял два базовых, описанных в других местах набора методов.
Один - собственно, основная работа класса (данные страницы, заголовок и т.п.)
Второй - групповая настройка данной группы классов (шаблон, некоторые опциональные параметры этого шаблона, названия секций и т.п. - всё, что будет общим для ряда разнокалиберных классов).
В принципе, я задачу сейчас решил, но - костылём. Загрузчик классов проверяет наличие в том же каталоге, откуда грузится нужный класс файла другого класса с зарезервированным именем и при его наличии - грузит и инициализирует, передавая в качестве параметра только созданный наш объект. Поскольку (повезло) все общие параметры конечных классов в этом частном случае можно задать через set-методы, то этот вторичный "класс-инициализатор" этим занимается. А все классы данной категории сайта лежат в одном каталоге, так что и инициатор для них - тоже один.
К сожалению, это очень частный случай.
Композиция вместо наследования тут не спасёт. Потому что, придётся делать обёртки для каждого метода из композиции, а таких методов - десятки. При чём все почти - из одной-двух строк, так что эти обёртки - тупо в полтора-два раза увеличат размер кода без какой-либо эффективной отдачи.
"Инверсия логики" класса, т.е. рассматривать родителем не источник данных, а нужную конфигурацию, а источник данных композировать в виде стороннего механизма источника этих данных тоже некрасиво, так как удваивается количество классов. Всё равно придётся писать класс-источник данных, но вдобавок - ещё и класс-заглушку, наследник текущего представления для вывода.
В общем, куда ни кинь - одни костыли выходят.
И ради чего? Ради отказа от естественного представления объектов в окружающем мире.
Яблоко - это растение, объект зелёного цвета, пища.
Звезда - это астрономический объект, природный термоядерный реактор, центр планетарной системы...
Куда ни кинь, все объекты - продукты множественного наследования.
И ООП, которое изначально сделало шаг в этом направлении, потом за совершенно неадекватными оговорками делает шаг назад и начинает вводить костыли в виде интерфейсов, композиций и т.п....
Главный (и единственный?) аргумент против множественного наследования - неоднозначности в случае появления одинаковых методов у разных родителей.
Но любой, даже самый тупой компилятор должен уметь отлавливать эти неодноначности на этапе компиляции.
Так откуда тогда могут взяться неоднозначности?
Мне, всё же кажется, что тут у народа какой-то массовый заскок.
… чтобы понять рекурсию, нужно сперва понять рекурсию …