Программисты всегда стремились к простоте и понятности кода. Умение осуществлять разнообразные операции с функциями, а в частности понимать принципы и способы взаимодействия функций с переменными, позволит не только создавать лаконичные PHP-скрипты, но и получить максимально возможную производительность вашего скрипта. Это же в свою очередь приведет к быстрой обработке данных и выведению требуемого результата в окне браузера. Более подробно о функциях РНР вы узнаете из этой главы. Если вы уже знакомы с ними, то просто пропустите ее. В главе рассматриваются следующие вопросы:
• списки аргументов переменной длины.
function foo ($arg_1, $arg_2, ..., $arg_n) {
echo "Пример функции.n" ;
return $retval;
}
Соответственно, внутри функции может быть любой верный код РНР, возможно объявление другой функции или класса.
РНР поддерживает так называемые переменные функции. Этот термин означает, что если вы добавите к своей функции имя переменной в скобках, то РНР будет искать функцию с именем, равным значению этой переменной, и предпримет попытку ее выполнить. Это можно использовать для реализации обратных вызовов, таблиц функций и т. д.
<?php
function foo() {
echo "In foo()<br>n";
}
function bar( $arg = '' ) {
echo "In bar(); argument was '$arg'.<br>n";
}
$func = 'foo';
$func ();
$func = 'bar';
$func( 'test' );
?>
Результат выполнения программы представлен на рис. 14.1.
Рис. 14.1. Результат выполнения скрипта
Результаты возвращаются через необязательный оператор return. Возвращаемый результат может быть любого типа, включая списки и объекты. Например:
function my_sqrt ($num) {
return $num * $num;
}
echo my_sqrt (4); // outputs '16'.
Массивы не могут быть возвращены в качестве результата, однако это можно реализовать другим способом, например:
function foo () {
return array (0, 1,2);
}
list ($zero, $one, $two) = foo();
Чтобы функция возвращала ссылку, следует использовать оператор ссылки & в объявлении функции и при присвоении возвращаемого значения переменной, например:
Передавать информацию в функции можно с помощью списка аргументов, который представляет из себя разделенный запятыми список переменных и (или) констант.
В ГОР можно передавать аргументы по ссылке, передача по значению осуществляется по умолчанию. Списки аргументов переменной длины поддерживаются только в РНР 4 и выше. Аналогичного эффекта можно достичь в РНР 3, передавая в функцию массив аргументов, например:
function {
echo "$input[0] + $input[1] = ", $input[0]+$input[1];
}
14.5. Передача аргументов по ссылке
По умолчанию все аргументы функции передаются только по значению, но если вам понадобилось модифицировать аргументы в функции, то вы можете передать их по ссылке.
Если же вы хотите сделать так, чтобы аргумент всегда передавался по ссылке, то следует поставить знак & перед именем аргумента в объявлении функции. Например:
function foo ( &$bar ) {
$bar . = 'and something extra.';
}
$str = 'This is a string.';
foo ($str);
echo $str; // выведет: 'This is a string, and something extra.'
Если вы хотите передать аргумент по ссылке в случае, когда по умолчанию такого не делается, то добавьте & перед именем аргумента в вызове функции, например:
function foo($bar) {
$bar , = ' and something extra. ';
};
$str = 'This is a string. ';
foo($str);
echo $str; // выведет 'This is a string, '
foo(&$str);
echo $str; // выведет 'This is a string, and something extra.'
14.6. Значения переменных по умолчанию
Функции могут определять значения по умолчанию для скалярных аргументов, как и в языке программирования C++. Например:
function makecoffee($type = "cappucino") {
echo "Making a cup of $type.n";
}
echo makecoffee();
echo makecoffee("espresso");
В результате будет выведено:
Making a cup of cappucino.
Making a cup of espresso.
Значение по умолчанию должно быть константой, а не переменной или, к примеру, членом класса.
ВНИМАНИЕ
Аргументы, объявленные по умолчанию, обязательно должны быть расположены справа от всех аргументов, объявленных другим методом, в противном случае это не будет работать так, как задумано.
Рассмотрим пример:
function makeyogurt($type = "acidophilus", $f!avour) {
return "Making a bowl of $type $flavour.n";
}
echo makeyogurt ("raspberry") ; // не будет работать, как ожидалось
Этот пример выведет следующее:
Warning: Missing argument 2 in call to makeyogurt() in /usr/local/etc/httpd/htdocs/php3test/functest.html on line 41
Making a bowl of raspberry.
А теперь сравните с этим:
function makeyogurt ($flavour, $type = "acidophilus") {
return "Making a bowl of $type $flavour.n";
}
echo makeyogurt ("raspberry") ; // а вот это работает
Результат программы:
Making a bowl of acidophilus raspberry.
14.7. Оператор old_function
Оператор old_function позволяет вам определять функцию, используя синтаксис PHP/FI2 (за исключением того, что вы должны заменить function на old_function).
Это свойство используется только для совместимости и лишь конверторами PHP/FI2 -> РНР 3.
Описанные таким образом функции никак не могут быть вызваны из служебного кода РНР. Это значит, что вы не можете использовать их в функциях типа usort(), array_walk() и register_shutdown_function(). Но вы можете обойти это путем введения специальной функции в терминах РНР 3, которая будет вызывать old_function.
14.8. Списки аргументов переменной длины
В PHP 4 имеется поддержка списков аргументов переменной длины в пользовательских функциях. С помощью функций func_num_args(), func_get_arg() и func_get_args() этого очень легко достичь. Не требуется никакого специального синтаксиса, списки аргументов могут по-прежнему явно задаваться в определении функции и будут нормально работать.
Заключение
Рассмотренная нами глава 14 «Базовые концепции функции» включает способы задания функций, а также принципы работы. Для систематизации материала выделим следующие концепции.
• Функции, определяемые пользователем. Пользователь, т. е. программист, задает непосредственно имя функции и назначает тот перечень операций, которые она должна выполнять. В свою очередь функция при правильном задании параметров осуществляет выполнение поставленной задачи и выводит результат пользователю. Помимо всего прочего в самой функции может быть объявлена еще одна функция.
• Переменные функции. Они, как и в первом случае, создаютсяпользователем, но несут другой смысл. Это значит, что если вы к фукнции добавите имя переменной в скобках, то РНР будет искать функцию с именем, равным значению этой переменной, и предпримет попытку ее выполнить.
• Возвращение результата. В зависимостиоттого, как вы производите задание функции и непосредственно операций, выполняемых в этой функции, вы будете получать необходимый вам результат. Будьте предельно внимательны, так как при работе с функциями, как и с классами, очень часто возникают ошибки по причине не донца осмысленного представления работы функции при возврате результата.