При программировании определенные фрагменты кода часто многократно ис
пользуются как в одном сценарии, так и в нескольких. Оформив эти подпро
граммы в виде отдельной функции, вы сэкономите время и облегчите програм
мирование, особенно при работе с быстро растущими сайтами. Если функция
создана, она будет выполнять заданные в ней действия при каждом вызове так
же, как функция print ( ) посылает текст в браузер при каждом ее использо
вании.
Синтаксис для создания определяемых пользователем функций следующий:
function FunctionName () {
statement(s);
При именовании функции нужно руководствоваться теми же самыми пра
вилами, что и при присвоении имен переменным, за исключением использо
вдния знака доллара. При определении и вызове функций знак $ не нужен.
Имена функций должны быть значимыми, как и названия переменных (напри
мер, CreateHeader более подходящее имя функции, чем Functionl). Помни
те, что нельзя использовать пробел, так как в этом случае имя функции будет
состоять из дву5с слов, что приведет к ошибке (знак подчеркивания является
общепринятой заменой пробела: Create_Header правильное имя функции).
В область, ограниченную фигурными скобками, можно вставлять любой
PHPкод, в том числе вызовы других функций. Количество инструкций в функ
ции может быть любым, но не забывайте после каждой инструкция ставить
точку с запятой.
При написании функции желательно придерживаться тех же правил фор
матирования, что использовались на протяжении всей книги, хотя это и Не
требуется синтаксисом. Главное, чтобы все необходимые элементы были на
месте. К ним относятся: слово function, имя функции, открывающая и закры
вающая круглые скобки, открывающая и закрывающая фигурные скобки и по
следовательность инструкций.
Инструкции функции традиционно размещаются с отступом от начала пре
дыдущей строки, это делает код более ясным. В любом случае выберите фор
мат, который вам больше нравится (он должен быть синтаксически и логичес
ки правильным), и придерживайтесь его.
Функция, создаваемая вами, вызывается с помощью обращения к ней, как
и любая встроенная функция. Строка кода FunctionName ( ) ; инициирует вы
полнение включенных в эту функцию инструкций.
Обратимся к генерирующему пароли сценарию (глава 5) и перепишем его
с использованием функции.
Создание и вызов базовой функции
- Откройте файл passwords.php в текстовом редакторе (листинг 9.1).
Листинг 9.1 т Это исходный сценарий для создания паролей, в котором не
используются функции. Создадим первую функцию с помощью кода, составля
ющего основу данной страницы. - Поменяйте стандартный HTMLзаголовок на тэг <?php.
Мы должны определить функцию до того, как она будет вызвана (это требу
ется в РНР 3.x), поэтому напишем функцию в самом начале сценария, до
HTMLкода. - function CreatePassword () {
Назовем функцию CreatePassword. Имя соответствует назначению функ
ции и легко запоминается. - Теперь поместим PHPкод (строки 613) из сценария passwords.php в функ
цию. Чтобы было видно, что эти строки принадлежат функции, я бы ре
комендовал разместить их с отступом от строки с именем функции (лис
тинг 9.2). - Закройте функцию на следующей строке фигурной скобкой (}).
Пропуск открывающей или закрывающей скобки распространенная при
чина ошибок, поэтому тщательно соблюдайте правила синтаксиса. - Закройте PHPкод тэгом ?>.
Мы закрываем PHPраздел страницы, так как собираемся писать HTMLкод.
При желании можно оставить раздел РНР открытым и послать код в браузер
с помощью функции print ( ) . В таком случае пропустите этот пункт. - Напишите стандартный HTMLзаголовок.
- Откройте новый PHPраздел страницы тэгом <?php.
В HTMLдокумент можно вставлять несколько разделов PHPкода, это впол
не обычная практика. CreatePasswordO ;
Если функция уже определена и вы хотите ее использовать, просто вызови
те ее по имени (будьте внимательны и не ошибитесь в написании). Не забывай
те про скобки.></BODYx/HTML>
Закройте второй PHPраздел и НТМЬтэги.- Сохраните сценарий, загрузите его на сервер (листинг 9.2) и протестируй
те в браузере (рис. 9.1). ч
1 <HTML> '
2 <HEAD>
3 <TITLE>Password Generator</TITLEx/HEAD>
4 <BODY>
5 <?php
6 $String = "This is the text which will be encrypted so that we may
create random and secure passwords!";
7 $Lerigth = 8; // Измените это значение, чтобы установить длину пароля.
32 символа максимум.
8 $String = md5($String);
9 $StringLength = strlen($String);
10 srand ((double) microtimeO * 1000000);
11 $Begin = rand(0,($StringLength$Lengthl)); // Pick an arbitrary
starting point.
12 $Password = substr($String, $Begin, $Length);
13 print ("Your recommended password is:<PxBIG>$Password</BIG>n");
14 ?> . •
15 </BODY>
16 </HTML>
$String = "This is the text which will be encrypted so
—that we may create random and secure passwords!";
$Length = 8 ; / / Измените это значение, чтобы установить длину пароля.
—32 символа максимум.
$String = md5($String);
$StringLength = strlen($String);
srand ((double) microtimeO * 1000000);
$Begin = rand(0,($StringLength$Lengthl)); // Pick an
—Получение произвольной точки старта".
$Password = substr($String, $Begin, $Length);
print ("Your recommended password is:
—<PxBIG>$Password</BIGxP> n") ;
<HTMLxHEADxTITLE>Password Generator within a Function</TITLEx/HEAD>
<BODY>
Листинг 9.2 т Размещение функции’ в самом начале сценария хороший
способ выделить ее. Подобным образом размещение инструкций функции с от
ступом помогает установить их принадлежность к функции. Затем одна строка
кода в основном теле сценария выполняет многочисленные инструкции.
1 <?php
2 function CreatеРавsword () {
3 $String = "This is the text which will be encrypted so that we may
create random and secure passwords!";
4 $Length =8; // Измените это значение, чтобы установить длину
пароля. 32 символа максимум.
5 $String = md5($String);
6 $StringLength = strlen($String);
7 srand ((double) microtimeO * 1000000);
8 $Begin • rand(0,($StringLength$Lengthl)); // Pick an arbitrary
starting point.
9 $Password = substr($String, $Begin, $Length) /•
10 print ("Your recommended password is: <P><BIG>$Password</BIGxP>
n") ;
11 } // Конец функции CreatePassword.
12 ?>
13 <HTML>
14 <HEAD>
15 <TITLE>Password Generator within a Function</TITLEx/HEAD>
16 <BODY> •
17' <?php
18 CreatePasswordO; У/ Вызов функции.
19 ?>
20 </BODY>
21 </HTML>
Если на вашем сервере установлен PHP 3.x, сначала необходимо определить функ
цию, и только после этого вызывать ее. Несмотря на то что в РНР 4.0 это ограни
чение снято, лучше располагать функции в самом начале сценария. Это гаранти
рует создание функции до ее вызова.
Имена создаваемых вами функций, так же как и имена встроенных функций РНР,
не чувствительны к регистру. Поэтому не имеет никакого значения, напишете ли
вы createpassword или CreatePassword.