Страницы

Поиск по вопросам

вторник, 16 июля 2019 г.

Функция с неопределенным кол-вом аргументов-ссылок

Собственно сабж, писал тут функцию рекурсивной stripslashes, подумалось, что неплохо было бы записать ее одним вызовом. Но: если аргумент один, все нормально function a(&$link) { $link = 'a'; } Если больше, начинаются проблемы: function upcase() { $args = &func_get_args(); foreach ($args as &$arg) $arg = strtoupper($arg); } $a = $b = $c = 'lol'; upcase(&$a, $b, $c); // &$a выдаст ворнинг, в большинстве случаев allow_call_pass_time_reference выключен. Но и в обратном случае не отработает) var_dump($a, $b, $c); // 'lol', 'lol', 'lol'... Пока нашел такое решение: function upcase(&$args) { if (is_array($args)) { foreach ($args as &$arg) upcase($arg); } else $args = strtoupper($args); } upcase($a = array(&$_GET, &$_POST, &$_REQUEST)); var_dump($_GET); Но по-моему решение грязное и пошлое. Есть предложения?


Ответ

Пара часов гугления дали такой результат. Он не идеален, но работоспособен) '; /* вариант 2 - почти не хак, но чуть менее удобен и сильно более затратен в техническом плане(все копируется дважды) + абсолютно прозрачен */ function upcase2() { $result = array(); foreach (func_get_args() as $arg) $result[] = strtoupper($arg); return $result; } $a = $b = $c = 'lol'; list($a, $b, $c) = upcase2($a, $b, $c); var_dump($a, $b, $c); /* Результат работы: string(3) "LOL" string(3) "LOL" string(3) "LOL" string(3) "LOL" string(3) "LOL" string(3) "LOL"
*/ ?>

Комментариев нет:

Отправить комментарий