Я решил ответить на этот вопрос, даже если вы уже приняли ответ на том основании, что ни один из приведенных ответов не является приемлемым. Хотя принятый ответ является технически правильным, есть способ обойти его. Что касается других ответов, их обходные пути не элегантны и не вполне удовлетворительны.
PHP поддерживает довольно непонятную функцию, которая позволяет одному интерфейсу наследоваться от другого, и фактически интерфейс способен наследовать от нескольких базовых интерфейсов.
Например, следующее совершенно верно:
interface iFoo
{
public function doFoo ();
}
interface iBar
{
public function doBar ();
}
interface iBaz extends iFoo, iBar
{
// This interface implicitly has all the methods of iFoo and iBar
}
Семантически, если вы хотите, чтобы метод / функция принимал только аргумент, который реализует несколько интерфейсов, то это, как правило, предполагает, что вы ожидаете, что классы, которые реализуют один и тот же набор нескольких интерфейсов, на самом деле должны реализовывать интерфейс, который охватывает оба интерфейсы, которым вы хотите, чтобы ваш аргумент соответствовал.
В вашем случае, если вы хотите что-то, что является ошибочным и записываемым, вам просто нужно добавить следующий интерфейс:
interface RecordableErrorable extends Recordable, Errorable { }
И тогда конструктор для вашего класса Recorder просто ожидает, что этот интерфейс будет использоваться в качестве аргумента.
public function __construct(RecordableErrorable $module) { }
Одним из возможных препятствий может быть, если Recordable и Errorable оба реализуют методы с одинаковыми именами. Там будет столкновение, которое нужно будет решить. Я верю, что в PHP есть механизмы для обработки этого случая, хотя я не могу сказать вам, что это такое.