Несколько сигнатур методов для одной абстрактной функции/абстрактной перегрузки

У меня есть абстрактный класс для перемещения данных из одной базы данных в другую, и иногда данные, необходимые для создания основных записей, отличаются из-за наличия устаревшей таблицы в целевой базе данных, которая включает инструкции по поиску данных в источнике. Очевидно упрощенно, вот где проблема вступает в игру:

abstract class foo
{
    protected abstract function createBaseEntry($id);
}

Иногда мне нужен только один идентификатор, переданный этой функции, но в некоторых случаях мне нужно передать два. Конечно, если фактическая сигнатура конкретного метода не соответствует абстрактному методу, PHP выдаст фатальную ошибку и остановит выполнение. Кроме предопределения нулевым максимальным количеством аргументов и изменения каждого конкретного класса, который расширяет этот, есть ли способ обойти это?


person Dereleased    schedule 15.12.2010    source источник


Ответы (1)


Вы можете использовать func_num_args() и func_get_args() для определения количества аргументов во время выполнения, если вы не можете/не хотите измените сигнатуру метода, чтобы иметь необязательный второй аргумент.

Пример

function foo()
{   
    $num  = func_num_args();
    $args = func_get_args();
    var_dump($num, $args);
}

foo(1, 2, 3);   

Вывод (кодовая панель)

int(3) 
array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) } 

Это также будет работать, когда в подписи определены аргументы.

person Gordon    schedule 15.12.2010
comment
Я думаю, что я просто собираюсь изменить его, чтобы принять запись, а затем позволить каждой реализации определять, что делать с этой записью/из нее; однако, поскольку ваше предложение очевидно правильное, я собираюсь принять его и продолжить свою жизнь. Проект критичен по времени, невозможно ухватиться за одну деталь =) - person Dereleased; 15.12.2010