У меня такая ситуация: функция 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") {
...
}
Конечно, можно использовать тест, как в примере выше, но это выглядит для меня действительно ужасным решением … Вопрос в следующем:
Есть ли лучший (быстрее, чище, умнее) код для реализации этого варианта использования?
Я думаю, что-то вроде этого должно быть то, что вы ищете:
Просто получите все аргументы функции с func_get_args()
, затем просто вызовите вашу следующую функцию с call_user_func_array()
.
function a($p1, $p2 = "default value") {
call_user_func_array("b", func_get_args());
}
функция 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');