РНР программирование |
Главная Программа телепередач, энциклопедии и многие другие справочные материалы |
Функции в PHP Как и любой другой алгоритмический язык, PHP имеет поддержку функций. В общем синтаксис функций в PHP наиболее близок к тому, как реализованы функции в C. ниже приведен пример очень простой функции: function mySum($a,$b) { $result = $a+$b; return($result); }; Использование этой функции: $result = mySum(2,3); По своей сути функции представляют собой участки кода, ассоциированные с определенным именем. Это как правило необходимо для того, чтобы иметь возможность выполнять какую-либо задачу несколько раз используя один и тот же код. Любая функция в PHP состоит из 4 основных частей:
Для иллюстрации дальнейшего материала предлагаю использовать следующую задачу: Есть глобальный массив $data, содержащий в себе некоторые данные. Необходимо написать функцию, которая бы при каждом вызове возвращала следующее значение из этого массива или null, если в массиве не осталось значений. При решении этой задачи мы сталкиваемся с небольшой проблемой: нам необходимо каждый раз возвращать из функции 2 значения (очередное значение из массива и текущее значение указателя в массиве). Однако необходимо заметить, что функция может вернуть только одно значение. Ниже мы рассмотрим разные варианты обхода этой проблемы.
// Функция достает следующее значение из глобального массива $data и возвращает его // Возвращает null, если в массиве не осталось ни одного значения. function getNext($counter) { global $data; if (isset($data[$counter])) { $result = array(); $result['data'] = $data[$counter]; $counter = $counter+1; $result['counter'] = $counter; return($result); } else return(null); }; // Использование этой функции $counter = 0; // Эта переменная будет использоваться в качестве "указателя" // на текущий элемент в массиве. while($next = getNext($counter)) // Получаем следующее значение { $value = $next['data']; // Значение из массива $counter = $next['counter']; // Новое значение указателя // Здесь мы каким-то образом используем полученные данные }; Кстати, не могу удержаться, чтобы не продемонстрировать, как можно записать то же самое по-другому: function getNext($counter) { return((isset($GLOBALS['data'][$counter]))? array('data'=>$GLOBALS['data'][$counter++],'counter'=>$counter): null); }; Как видите - намного компактнее, хотя с первого взгляда и менее понятно.
Для возврата нескольких значений из функции можно использовать запись необходимых значений непосредственно в глобальные переменные. Обычно это считается очень плохим стилем программирования т.к. делает программу очень трудной для понимания и потенциально является источником ошибок, но я приведу здесь подобный вариант решания просто в качестве примера: function getNext() { global $data, $counter; if (isset($data[$counter])) return($data[$counter++]); else return(null); }; Как видите - здесь мы отказываемся от передачи указателя в качестве аргумента, а вместо этого обращаемся непосредственно к глобальной переменной, в которой он хранится.
В PHP4 появилась возможность работать со ссылками (references). Это очень мощный механизм, о котором мы поговорим подробнее немного позже. Если вы знакомы с C/C++, то для вас references не будут чем-то новым - это аналог указателей в C. Если же нет, то вкратце объясню, что references позволяют нескольким разным переменным ссылаться на одно и то же значение. Может быть кому-то проще будет представить это как одну переменную с несколькими именами. Признаком использования references является наличие знака & перед именем переменной. А теперь посмотрим, как решить нашу задачу с использованием references. function getNext(&$counter) { global $data; if (isset($data[$counter])) return($data[$counter++]); else return(null); }; Как видите, здесь мы снова обошлись возвратом единственного значения, избежав при этом использования обращений к счетчику как глобальной переменной. Это стало возможным благодаря тому, что счетчик передается в функцию не "по значению", а "по ссылке". Т.о. меняя значение аргумента мы фактически меняем значение переменной, на которую ссылается этот аргумент, т.е. в нашем случае - глобальную переменную счетчика. И, наконец, еще один способ решения подобной проблемы. Он применим не всегда, а только в случаях, подобных рассматриваемому, когда в качестве параметров функции фигугрируют счетчики, или другие переменные, которые постоянно передаются в функцию при каждом ее вызове.
В PHP возможно создание статических переменных внутри функции. Эти переменные отличаются от обычных тем, что, будучи локальными переменными внутри функции, они между тем сохраняют свое значение между вызовами функций. Посмотрим, как выглядит решение нашей задачи с использованием статической переменной в качестве счетчика: function getNext() { global $data; static $counter=0; if (isset($data[$counter])) return($data[$counter++]); else return(null); }; // Использование этой функции while($value = getNext()) { // Здесь мы каким-то образом используем полученные данные }; Как видите, в нашем случае использование статической переменной здорово упростило код. Ну и еще пара вариантов решения нашей задачи: Вариант 1: foreach($data as $value) { // Здесь мы каким-то образом используем полученные данные }; Вариант 2: reset($data); while(list($key,$value) = each($data)) { // Здесь мы каким-то образом используем полученные данные };
|