Как использовать значение параметра по умолчанию во вложенном вызове?

У меня такая ситуация: функция a (метод класса, но это не важно, здесь …) вызывает функцию b,
функция a имеет один параметр (скажем, $p2), с дефолт значение.
функция b имеет один параметр (скажем, $q2), с дефолт значение тоже.

Если функция a называется без параметр $p2функция b должен быть назван без параметр $q2тоже, чтобы заставить его использовать значение по умолчанию.
Если функция a называется с параметр $p2функция b должен быть назван с параметр $q2,

Чтобы уточнить на примере:

function a($p1, $p2 = "default value one") {
if ($p2 === "default value") {
b($p1);
} else {
b($p1, $p2);
}
}

function b(q1, q2 = "default value two") {
...
}

Конечно, можно использовать тест, как в примере выше, но это выглядит для меня действительно ужасным решением … Вопрос в следующем:

Есть ли лучший (быстрее, чище, умнее) код для реализации этого варианта использования?

0

Решение

Я думаю, что-то вроде этого должно быть то, что вы ищете:

Просто получите все аргументы функции с func_get_args(), затем просто вызовите вашу следующую функцию с call_user_func_array().

function a($p1, $p2 = "default value") {
call_user_func_array("b", func_get_args());
}
1

Другие решения

функция a параметр по умолчанию должен иметь то же значение, что и функция b параметр по умолчанию:

function a($p1, $p2 = null) {
b($p1, $p2);
}

function b($p1, $p2 = null) {
var_dump($p1, $p2);
}

Так зовет a с обоими параметрами передадут эти параметры в функцию bпри вызове функции a только первый набор параметров вызовет b с переданным первым от пользователя и вторым параметром в качестве значения по умолчанию:

а (2, 5); // -> (int) 2 (int) 5

а (2); // -> (int) 2 NULL


[ОБНОВИТЬ]

Если функции могут иметь разные значения по умолчанию, чем вам нужно определить значение по умолчанию:

function a($p1, $p2 = null) {
$p2 = !is_null($p2) ? $p2 : 'defaultB';

b($p1, $p2); // For string use `stricmp($p2, 'defaultA') !== 0`
}

function b($p1, $p2 = 'defaultB');
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector