- •Тема 1 Основы cgi-программирования
- •1.1 Методы передачи данных
- •1.2 Передача документа пользователю
- •1.3 Передача информации cgi-сценарию
- •Тема 2 Характеристика языка php
- •2.1 Принцип работы php
- •2.2 Переменные, константы, выражения
- •Тема 3 Работа с данными формы
- •3.1 Передача данных
- •3.2 Трансляция полей формы в переменные
- •Тема 4 Конструкции языка
- •4.1 Условные инструкции
- •4.2 Инструкции циклов
- •4.3 Инструкции включения
- •Тема 5 Ассоциативные массивы
- •5.1 Списки и ассоциативные массивы
- •5.2 Операции над массивами
- •5.3 Списки и строки
- •5.4 Сериализация
- •Тема 6 Работа с массивами
- •6.1 Сортировка массивов
- •6.2 Функции для работы с массивами
- •Тема 7 Функции и области видимости
- •7.1 Формат определения функции, передача параметров
- •7.2 Глобальные, локальные, статические переменные
- •7.3 Рекурсия, вложенные и условно-определяемые функции
- •7.4 Передача функций по ссылке и возврат функцией ссылки
- •Тема 8 Строковые функции
- •8.1 Функции работы со строками
- •8.2 Работа с блоками текста
- •Тема 9 Математические функции
- •9.1 Встроенные константы
- •9.2 Встроенные функции
- •Тема 10 Работа с файлами и каталогами,
- •10.1 Функции работы с файлами
- •10.2 Блокирование файла
- •10.3 Функции работы с каталогами
- •10.4 Запуск внешних программ
- •Тема 11 Работа с датами и временем,
- •11.1 Представление времени в формате timestamp
- •11.2 Работа с датами, григорианский календарь
- •11.3 Посылка писем через php
- •Тема 12 Работа с www
- •12.1 Установка заголовков ответа
- •12.2 Работа с Cookies
- •Тема 13 Управление интерпретатором
- •13.1 Управление интерпретатором
- •13.2 Управление сессиями
- •Тема 14 Работа с базой данных mysql
- •14.1 Соединение с базой данных
- •14.2 Выполнение запросов к базе данных
- •Тема 15 Загрузка файлов на сервер
- •15.1 Multipart-формы, тег выбора файла
- •15.2 Поддержка закачки в php
- •Учебное издание
- •Разработка программного обеспечения на платформе net: php.Net
- •246019 Г. Гомель, ул. Советская, 104
Тема 7 Функции и области видимости
7.1 Формат определения функции, передача параметров
7.2 Глобальные, локальные, статические переменные
7.3 Рекурсия, вложенные и условно-определяемые функции
7.4 Передача функций по ссылке и возврат функцией ссылки
7.1 Формат определения функции, передача параметров
Формат определения функции:
function имя_функции (арг1[=зн1], арг2[=зн2], ... аргN[=знN])
{
операторы_тела_функции;
}
Имя функции должно быть уникальным с точностью до регистра букв. Это означает, что, во-первых, имена MyFunction, myfunction и даже MyFuNcTiOn будут считаться одинаковыми, и, во-вторых, нельзя переопределить уже определенную функцию (стандартную или нет – не важно), но зато можем давать функциям такие же имена, как и переменным в программе (конечно, без знака $ в начале). Список аргументов состоит из нескольких перечисленных через запятую переменных, каждая из которых должна задаваться при вызове функции (если для этой переменной присвоено через знак равенства значение по умолчанию (обозначенное =знM), ее можно будет опустить).
Если у функции не должно быть аргументов, то следует оставить пустые скобки после ее имени, например:
function SimpleFunction()
{ ... }
В фигурные скобки заключается тело функции. В нем могут быть любые операторы, включая даже операторы определения других функций (однако эти «другие функции» не будут локальными, как в Паскале, а станут далее «видны» для всей программы, но только с того момента, как до их описания дойдет управление). Если функция должна возвращать какое-то значение, что среди них должен встретиться оператор return. Если же она должна отработать без возврата значений, то оператор return можно и не указывать (или указывать без задания возвращаемого значения).
Синтаксис оператора return:
return возвращаемое значение;
В PHP можно использовать return абсолютно для любых объектов (какими бы большими они ни были), причем без заметной потери быстродействия. Пример:
function MySqrt($n)
{ return $n*$n;
}
echo MySqrt(4); // выводит 16
Сразу несколько значений функции возвратить не могут. Однако, если это все же нужно, то можно вернуть ассоциативный массив или список:
function Silly()
{ return array(1,2,3);
}
// присваивает массиву значение array(1,2,3)
$arr=Silly();
// присваивает переменным $a, $b, $c первые значения из списка
list($a,$b,$c)=Silly();
Если функция не возвращает никакого значения, т. е. инструкции return в ней нет, то считается, что функция возвратила значение false.
Вызывать функции нужно только после того, как они будут определены.
В отличие от других языков программирования, функцию можно задавать не только в определенном месте программы, но и прямо среди других операторов:
echo "Программа...";
function GetMaxNum($arr,$max)
{ ... тело функции ...
}
echo "Программа продолжается!";
При таком подходе транслятор, дойдя до определения функции, проверит его корректность и оттранслирует во внутреннее представление, но не будет генерировать код для выполнения, а сразу переключится на следующие за телом функции команды. Только потом, при вызове функции, интерпретатор начнет исполнять ее команды.
Параметры по умолчанию. Часто бывают необходимо, чтобы у функции было много параметров, причем некоторые из них будут задаваться совершенно единообразно. Например, нужна функция сортировки массива. Тогда, кроме очевидного параметра – массива – хотелось бы также задавать и второй параметр, который бы указывал порядок сортировки (в убывающем или в возрастающем порядке). При этом чаще всего придется сортировать в порядке убывания. В этом случае мы можем оформить функцию так:
function MySort(&$Arr, $NeedLoOrder=1)
{ ... сортируем в зависимости от $NeedLoOrder...
}
Теперь, имея такую функцию, можно написать в программе:
MySort($my_array,0); // сортирует в порядке возрастания
MySort($my_array); // второй аргумент задается по умолчанию!
То есть, можно опустить второй параметр у функции, что будет выглядеть так, как будто его задали равным 1. Значение по умолчанию для какого-то аргумента указывается справа от него через знак равенства. Значения аргументов по умолчанию должны определяться справа налево, причем недопустимо, чтобы после любого из таких аргументов шел обычный «неумолчальный» аргумент. Пример неверного описания функции:
// Ошибка!
function MySort($NeedLoOrder=1, &$Arr)
{
... сортируем в зависимостиот $NeedLoOrder...
}
MySort(,$my_array); // Ошибка!
Передача параметров по ссылке. Рассмотрим механизм передачи аргументов функции. Пусть, например, есть такая программа:
function Test($a)
{ echo "$a\n"; // распечатается значение 10
$a++;
echo "$a\n"; // распечатается значение 11
}
. . .
$num=10;
Test($num);
echo $num; // распечатается значение 10
Функция Test() не возвращает никакого значения, т. е. является в чистом виде подпрограммой или процедурой. Создается переменная $a, локальная для данной функции, и ей присваивается значение 10 (то, что было в $num). После этого значение 10 выводится на экран, величина $a инкрементируется, и новое значение (11) опять печатается. Так как тело функции закончилось, происходит возврат в вызвавшую программу. При последующем выводе переменной $num будет напечатано 10 (и это несмотря на то, что в переменной $a до возврата из функции было 11!). Это происходит потому, что $a – лишь копия $num, а изменение копии никак не отражается на оригинале.
Если необходимо, чтобы функция имела доступ не к величине, а именно к самой переменной (переданной ей в параметрах), достаточно при передаче аргумента функции перед его именем поставить &.
Пример передачи параметров по ссылке (первый способ):
function Test($a)
{ echo "$a\n";
$a++;
echo "$a\n";
}
$num=10; // $num=10
Test(&$num); // теперь $num=11!
echo $num; // выводит 11!
Такой способ передачи параметров исторически называется «передачей по ссылке», в этом случае аргумент не является копией переменной, а «ссылается» на нее. Передача параметра по ссылке полностью соответствует синтаксису задания ссылочной переменной в PHP.
Чтобы не забывать каждый раз писать & перед переменной, передавая ее функции, существует и другой синтаксис передачи по ссылке: можно символ & перенести прямо в заголовок функции.
Передача параметров по ссылке (второй способ):
function Test(&$a)
{ echo "$a\n";
$a++;
echo "$a\n";
}
....
$num=10; // $num=10
Test($num); // а теперь $num=11!
echo $num; // выводит 11!
В качестве параметров, передаваемых по ссылке, можно задавать только переменные, но не непосредственные значения!
Переменное число параметров. Функция может иметь несколько параметров, заданных по умолчанию. Они перечисляются справа налево, и их всегда фиксированное количество. Пусть необходимо написать функцию, которая принимает один или более параметров (сколько именно – неизвестно на этапе определения функции). Пусть она должна вывести эти параметры «лесенкой» – каждый следующий на новой строке с отступом от предыдущего.
Пример передачи переменного числа параметров функции:
function myecho()
{ for($i=0; $i<func_num_args(); $i++)
{
for($j=0; $j<$i; $j++) echo " ";// выводим отступ
echo func_get_arg($i)."<br>\n"; // выводим элемент
}
}
// отображаем строки «лесенкой»
myecho("Меркурий", "Венера", "Земля", "Марс");
При описании myecho() указаны пустые скобки в качестве списка параметров, словно функция не получает ни одного параметра. На самом деле в PHP при вызове функции можно указывать параметров больше, чем задано в списке аргументов – в этом случае никакие предупреждения не выводятся (но если фактическое число параметров меньше, чем указано в описании, PHP выдаст сообщение об ошибке). «Лишние» параметры как бы игнорируются, в результате пустые скобки в myecho() позволяют в действительности передать ей сколько угодно параметров.
Для того чтобы иметь доступ к «проигнорированным» параметрам, существуют три встроенные в PHP функции:
int func_num_args()
Возвращает общее число аргументов, переданных функции при вызове.
mixed func_get_arg(int $num)
Возвращает значение аргумента с номером $num, заданного при вызове функции. Нумерация отсчитывается с нуля.
list func_get_args()
Возвращает список всех аргументов, указанных при вызове функции.
Пример использования функции func_get_args:
function myecho()
{ foreach(func_get_args() as $v) {
for($j=0; $j<@$i; $j++) echo " ";
echo "$v<br>\n";
@$i++;
}
}
// выводим строки "лесенкой"
myecho("Меркурий", "Венера", "Земля", "Марс");
В программе используется цикл foreach для перебора аргументов, а также оператор отключения ошибок @, чтобы PHP не «ругался» на то, что переменная $i не определена при первом «обороте» цикла.
