Как водится, сразу начну с примера. Предположим, нам необходимо в программе очень часто находить в массиве-списке наибольший элемент, который в то же время меньше какого-то, наперед заданного числа. А именно, нас интересует его номер в массиве (если такого числа в массиве нет, то номер полагается равным -1). Напишем для этой цели функцию (такое описание называется определением функции, и оно, конечно, должно быть единственным в пределах сценария).
Листинг 11.1. Пример функции
function GetMaxNum($arr, $max="")
{ // проходимся по всем элементам массива
for($i=0,$n=-1; $i<count($arr); $i++) {
// если этот элемент нам пока подходит, запоминаем его
if((!Isset($m) || $arr[$i]>$m) && ($max==="" || $arr[$i]<$max)) {
// сюда мы попадаем, когда очередной элемент больше текущего,
// либо же текущего элемента еще не существует (первый проход)
$m=$arr[$i]; // запоминаем текущий элемент
$n=$i; // запоминаем его номер
}
}
return $n;
}
В отличие от других языков программирования, функцию можно задавать не только в определенном месте программы, но и прямо среди других операторов. Например, вполне можно было бы поместить нашу функцию GetMaxNum() прямо в середину кода, скажем, так:
echo "Программа...";
function GetMaxNum($arr,$max)
{ ... тело функции ...
}
echo "Программа продолжается!";
При таком подходе транслятор, дойдя до определения функции, просто проверит его корректность и оттранслирует во внутреннее представление, но не будет генерировать код для выполнения, а сразу переключится на следующие за телом функции команды. Только потом, при вызове функции, интерпретатор начнет исполнять ее команды...
Итак, мы создали функцию с именем GetMaxNum() и двумя параметрами, первый из которых рассматривается ей как массив, а второй — как вещественное число.
На самом деле на этапе создания функции еще никаких предположений о типах параметров не строится. Однако попробуйте нашей функции вместо массива в первом аргументе передать число — интерпретатор "заругается", как только выполнение дойдет до строчки с $arr[$i], и скажет, что "переменная не является массивом".[E50]