Создание пользовательских функций.
Синтаксис задания функций в PHP.
Функция может быть объявлена в любой части программы ( в пределах операторов <? и ?>), но до места ее использования. Для объявления функций используется синтаксис:
function Имя (аргумент1 [=значение1], . . . ,аргументN [=значениеN])
{
тело функции
}
Объявление функции начинается служебным словом function, затем следует имя функции, после имени - список аргументов в скобках. Тело функции заключается в фигурные скобки и может содержать произвольное количество операторов.
Требования к именам функций:
Т.к. тип возвращаемого значения может быть любым, его (тип) не указывают вовсе. Для передачи результата работы функции в основную программу используется инструкция return. Если функция ничего не возвращает, инструкцию return не указывают. Инструкция return может возвращать все, что угодно, в том числе и массивы.
Пример функции возвращающей массив из 10 случайных чисел:
<?
function GetRand()
{
$LocalArr = array();
mt_srand (time());
for ($i=0; $i<10; $i++)
$LocalArr [ ] = mt_rand(0,100);
return $LocalArr;
}
$A = GetRand();
foreach ($A as $K=>$v) echo "$v";
?>
Описание работы функции: функция создает пустой локальный массив $LocalArr, затем настраивает регенератор случайных чисел на новую последовательность (mt_srand), чтобы при каждом новом запуске программы получалась новая строка. Затем заполняется массив случайными числами и передается в основную программу, где присваивается массиву $A. Цикл foreach выводит значения массива.
При объявлении функции нужно указать список параметров, которые могут передаваться функции, например:
function func ($a, $b, $c) { . . . };
При вызове функции func() нужно обязательно указать все три параметра, поскольку они обязательны.
Передача переменных по ссылке.
В PHP есть два вида аргументов функций:
Функция не может изменить параметр - значение, то есть он доступен "только для чтения" - она может его использовать, но не более. В качестве параметра - значения необязательно указывать переменную, можно указать само значение, отсюда название - параметр - значение, например:
function func($a)
{
echo "Параметр = $a\n";
}
$b = 3;
func (3);
func ($b);
Данная функция выведет строку "Параметр - 3" дважды.
В отличии от параметров - значений, параметр -переменные могут быть изменены в процессе работы функции. Здесь уже нельзя передавать значение, нужно обязательно передать переменную. В PHP для объявления параметров - переменных используется механизм передачи переменной по ссылке. Пример передачи переменной по ссылке:
<?
$First = $Second = 5;
function f1 ($f, &$s)
{
echo "Изменяем параметры\n";
$f = 7; $s = 10;
echo "First = $f, Second = $s\n";
}
echo "Значение переменных до вызова функции\n";
echo "First = $First Second = $Second\n";
f1 ($First, $Second);
echo "First = $First Second = $Second\n";
?>
В PHP функция может возвращать любое значение в зависимости от переданных ей параметров. параметры по умолчанию описываются так:
имя_параметра = значение
Например: function my_func ($x = 10, $y = 5)
Если параметр не задан при вызове функции, интерпретатор передаст функции значение параметра по умолчанию.
Переменное число параметров в функции.
Контроль за количеством переданных параметров по умолчанию осуществляется функциями - func_num_args() и func_get_arg().
Первая возвращает число переданных функций аргументов, а вторая - аргумент с указанным номером. Кроме данных двух функций можно использовать еще одну - func_get_args(), которая возвращает список всех аргументов. Например:
foreach (func_get_args() as $a=>$v)
{
echo "<tr><td>$a</td><td>$v</td></tr>";
}
Пример функции print_str, которая выводит переданные ей строки в виде таблицы HTML:
<?
function print_str()
{
echo "<table border=1 width=100%>";
echo "<tr><td bgcolor=blue><font color=white>Номер</font></td>";
echo "<td bgcolor=blue><font color=white>Параметр</font></td>";
for ($i=0; $i<func_num_args(); $i++)
{
echo "<tr><td>$i</td><td>" .func_get_arg($i) . "</td></tr>";
}
echo "</table>";
}
print_str ("Первый", "Второй", "Третий", "Четвертый");
?>
Локальные и глобальные переменные.
Локальные переменные доступны только в функции, а глобальные во всей программе. Они доступны всем функциям.
Пример использования глобальных и локальных переменных:
<?
$i = 10;
$g = 7;
function f1 ()
{
$x = 5;
$i = 0;
global $g;
echo "g = $g\n";
echo "i = $i\n";
}
f1();
echo "$x\n";
?>
Переменные $i и $g - глобальные, они доступны во всей программе. Для передачи глобальных переменных в функцию используется инструкция global:
global список переменных
Если не выполнить эту инструкцию, функция не получит доступ к переменной $g. В данном примере использованы две переменные $i: одна - глобальная, другая - локальная ( в теле функции).
В функции используется локальная переменная, однако, если объявить переменную глобальной:
global $g, $i;
то будет использоваться значение глобальной переменной.
Кроме глобальных и локальных переменных, существуют переменные - статические. Если в теле функции объявлена статическая переменная, то компилятор не будет ее удалять после завершения работы функции. Например:
<?
function f1() { static $x; $x++; echo "$x";}
for ($i=0; $i++<5;) f1();
?>
Этот сценарий выведет строку 1 2 3 4 5 . Если удалить инструкцию static, то будет выведена строка 1 1 1 1 1, потому что переменная $x будет удаляться при завершении работы функции и обнуляться при каждом вызове. Т.к. переменная $x инкрементируется сразу после обнуления, а потом выводится, поэтому в результате 1 1 1 1 1, а не 0 0 0 0 0. Статические переменные не являются элементами $GLOBALS.
Рекурсией называется вызов функции самой на себя. Такой вызов называется рекурсивным. Рекурсия бывает прямая и обратная.
Пример прямой рекурсии:
<?
function fact ($x)
{
if ($x==0) return 1;
else return $x*fact ($x-1);
}
echo fact (7);
?>
Функция fact() вычисляет факториал x!. Функция fact() в своем теле вызывает саму себя - это и есть прямая рекурсия. Непрямая рекурсия возникает, когда первая функция вызывает вторую, а вторая - первую.