Intereting Posts
Пересечение многомерного массива различного размера Как сохранить форматирование HTML без изменений при анализе с помощью DOM – (без отключения дескриптора) Возможно ли, чтобы preg заменил уникальные переменные на строку? Борьба с отображением изображения blob с php Удаление строки из вывода php json Задайте несколько полей с одним запросом обновления PHP Отправка писем с прикрепленными файлами – электронная почта не отправляется вообще PHP Автозагрузка с SplClassLoader? PHP isset () с несколькими параметрами Нужна помощь, игнорируя сертификат сервера при привязке к LDAP-серверу с помощью PHP Когда контейнеры для инъекций зависимостей становятся слишком большими, и что я могу сделать с этим? Функция PHP mail () не работает на веб-хосте Как сравнить 2 таблицы в цикле Лучший способ интегрировать результат Javascript с PHP Массив для SVG, гибкий алгоритм с PHP

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

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

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

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

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

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