|
она была описана.
Однако это работает, конечно же, только в том случае, когда в момент интер-
претации вызова функции ее код будет уже оттранслирован (например, вызов
и описание функции происходят в одном и том же файле). Тем не менее, не
советую вам злоупотреблять данной возможностью — лучше всегда поступать
так, как это принято в Паскале: вызывать функции только после того, как они
будут определены.
Зачем может понадобиться функция GetMaxNum() в реальной жизни? Например, для
сортировки массива в порядке убывания с одновременным получением уникальных
элементов. Конечно, это будет очень неоптимальный алгоритм, но для тренировоч-
ных целей он нам вполне подойдет (листинг 11.2):
Листинг 11.2. Сортировка с применением GetMaxNum()
function MySort($Arr)
Часть III. Основы языка PHP 184
{ $m= GetMaxNum($Arr)+1; // число, на 1 большее максимума в массиве
while(($n=GetMaxNum($Arr,$m))!=-1)
$New[]=$m=$Arr[$n]; // добавляем очередной максимальный элемент
return $New;
}
// Пример вызова:
$Sorted=MySort(array(1,2,5,2,4,7,3,7,8));
// Теперь $Sorted===array(8,7,5,4,3,2,1)
Приведенная функция не изменяет исходный массив, а возвращает новый. В силу
устройства функции GetMaxNum() в результирующий массив будут помещены толь-
ко уникальные элементы из $Arr, отсортированные в порядке убывания.
Функцию MySort() можно ускорить примерно в 2 раза, если после каждой
итерации удалять из массива $Arr обработанный элемент при помощи
Unset(). Впрочем, это не так интересно, как может показаться.
Общий синтаксис
определения функции
В общем виде синтаксис определения функции таков:
function имя_функции(арг1[=зн1], арг2[=зн2], ... аргN[=знN])
{ операторы_тела_функции;
}
Имя функции должно быть уникальным с точностью до регистра букв. Это означает,
что, во-первых, имена MyFunction, myfunction и даже MyFuNcTiOn будут считать-
ся одинаковыми, и, во-вторых, мы не можем переопределить уже определенную
функцию (стандартную или нет — не важно), но зато можем давать функциям такие
же имена, как и переменным в программе (конечно, без знака $ в начале). Список
аргументов, как легко увидеть, состоит из нескольких перечисленных через
запятую
переменных, каждую из которых мы должны будем задать при вызове функции
(впрочем, когда для этой переменной присвоено через знак равенства значение по
умолчанию (обозначенное =знM), ее можно будет опустить; см. об этом чуть ниже).
Конечно, если у функции не должно быть аргументов вовсе (как это сделано у
функ-
ции time()), то следует оставить пустые скобки после ее имени, например:
function SimpleFunction() { ... }
В фигурные скобки заключается тело функции. В нем могут быть любые операторы,
включая даже операторы определения других функций (правда, эти "другие функции"
Глава 11. Функции и области видимости 185
не будут локальными, как в Паскале, а станут далее "видны" для всей программы,
но
только с того момента, как до их описания дойдет управление — об этом мы еще
по-
говорим). Если функция должна возвращать какое-то значение, что среди них
должен
встретиться оператор return, который мы сейчас рассмотрим. Если же она должна
отработать без возврата значений (то есть, выражаясь в терминах Паскаля, это не
функция, а процедура), то оператор return можно и не указывать (или указывать
без
задания возвращаемого значения).
Инструкция return
Синтаксис оператора return абсолютно тот же, что и в Си, за исключением одной
очень важной детали. Если в Си функции очень редко возвращают большие объекты
(например, структуры), а массивы они не могут возвратить вовсе (это явный
прокол в
концепции Си), то в PHP можно использовать return абсолютно для любых объек-
тов (какими бы большими они ни были), причем без заметной потери быстродейст-
вия. Вот пример простой функции, возвращающей квадрат своего аргумента:
function
|
|