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

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

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

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

1 Ответ

4 голосов
/ 15 декабря 2010

Вы можете использовать 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) } 

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

...