Передача параметров в php-функцию
PHP-функция может принимать параметры, например так:
function f1( $arg1, $arg2 )
Предположим мы определили эту функцию и использовали её в своих скриптах. Но через какое-то время, решили добавить еще пару параметров, чтобы расширить возможности. Теперь, для того, чтобы обеспечить совместимость с предыдущими скриптами, для новых параметров нужно добавить значения по-умолчанию:
function f1( $arg1, $arg2, $arg3 = '', $arg4 = '' )
То есть теперь, если при вызове функции не указывать последние два аргумента, то им будут присвоены дефолтные значения: в нашем случае - пустая строка.
Проходит еще какое-то время и мы решаем добавить в нашу функцию еще и параметры для форматирования. Например html-элементы «до» и «после», class, шаблон форматирования и т.д. Получается, что параметров у нашей функии становится довольно много и пользоваться ей уже не совсем удобно. Тем более может возникнуть ситуация, когда указать нужно не все параметры, а скажем только 5-й и 8-й.
В таких случаях на помощь может прийти функция парсинга строки URL. То есть в функцию мы передаем только одну строчку, состоящую из нужных нам параметров, но оформленную по правилам URL:
function f1( $args = '' )
{
parse_str($args, $r);
...
Пример вызова:
f1('b=555&a=777');
В результате в массиве $r окажется структура:
Array
(
[a] => 777
[b] => 555
)
Казалось бы, что проблема решена: мы можем не изменяя объявления функции, менять её функционал. Но есть один нюанс. Связан он с тем, что строчка параметров должна передаваться по правилам URL-строки, где необходимо заменять служебные символы (кавычки, пробелы и т.д.) на их коды. Таким образом, перед тем, как выполнить parse_str, нужно выполнить парсинг строки.
Всё это не совсем удобно, но мы видим, что в результате нам всё равно нужно получить массив параметров. Так что нам мешает сразу передавать в параметре готовый массив?
Вот пример:
function f1( $args = array() )
{
if ( is_array($args) ) $r = $args;
else parse_str($args, $r);
# контроль
echo '<pre>';
print_r( $r );
echo '</pre>';
}
# примеры вызова
f1( array ('a' => '888') );
f1( 'b=555&a=777' );
Обратите внимание, что функция сама проверяет тип параметра (is_array). Если это не массив, то выполняется parse_str. Получается универсальный подход.
Однако это еще не всё. Как быть в случае, если в параметрах переданы не все значения? Тут есть два подхода.
Первый - это явно прописать проверку на существование значения и если его нет, то взять дефолтное:
if ( !isset($r['a']) ) $r['a'] = '1'; if ( !isset($r['b']) ) $r['b'] = '2';
Второй способ - это задать массив дефолтных значений, который мы просто объединяем с входящим:
$default = array( 'a' => '1', 'b' => '2', 'c' => '3', ); $r = array_merge($default, $r);
Теперь, при вызове:
f1( array ('a' => '888', 'c' => '999') );
Получим в $r:
Array
(
[a] => 888
[b] => 2
[c] => 999
)
Как видите, все довольно просто и элегантно.
Постоянная ссылка: http://maxsite.org/?p=336
Версия для печати
