Четверг, 16.05.2024, 17:43
DigitalBox
Приветствую Вас Гость | RSS
Главная Создание функции Регистрация Вход
Меню сайта

Создание функции



Приложения обычно выполняют одни и те же действия в разных частях сценария. И здесь приходят на помощь функции. Функция (function) представляет собой набор инструкций, предназначенных для выполнения определенных действий.

Предположим, например, что к каждой Web-странице необходимо добавить следующую информацию:

echo '<img src="greenrule.jpg" width="100%" height="7" />
<address>Moя компания
<br />ул. Прекрасная 1234
<br />Сан Диего, СА 92126
< /addres>< /font>
<р>или обращайтесь в
     <а href="mailto:sales@company.com">отдел продаж </а>
<img src="greenrule.jpg" width="100%" height="7" / > ';

Обычно в начало или в конец Web-страницы добавляют куда больше информации. Поэтому гараздо эффективнее создать функцию, например с именем add_footer(), чем каждый раз писать один и тот же код в конце страниц. Затем нужно добавить в код сценария имя функции (т.е. вызвать ее), которая выведет нужную информацию:

add_footer()

Обратите внимание на наличие скобок после имени функции. Они являются обязательными и указывают интерпретатору РНР на то, что выполняется вызов функции.


Определение функций

Для создания функции необходимо наполнить тело функции (т.е. определить набор команд, которые она должна выполнять). Общий синтаксис функции имеет вид:

function иия_функции()
{
     набор команд;
     return;
}

Рассмотрим, например, функцию, которая добавляет специальную информацию в конец Web-страницы (она уже упоминалась в предыдущем разделе):

function add_footer()
{
     echo '<img src="greenrule.jpg" width="100%" height="7" />
     <address>Moя компания
     <br />ул. Прекрасная 1234
     <br />Сан Диего, СА 92126
     </address></font>
     <р>или обращайтесь в
     <а href="mailto:sales@company.com">отдел продаж </а>
     <img src="greenrule.jpg" width="100%" height="7" />';
     return;
}

Оператор return останавливает выполнение тела функции и передает управление основному коду сценария. (Инструкция return не является обязательной в конце тела функции, но ее использование позволяет легче объяснить принципы ее работы. Более подробно оператор return рассматривается ниже.)

Функции можно определять в любом месте сценария, но обычно их помещают либо в начало, либо в конец сценария. Функции, которые предполагается использовать в нескольких сценариях, следует размещать в отдельном файле и включать его там, где это необходимо.

Наверное, к этому моменту вы задались следующим вопросом: "Почему бы мне просто не поместить информацию, которую необходимо выводить в конце каждой Web-страницы, в отдельный файл, скажем footer.inc, и включать его в сценарии?" Хороший вопрос! В принципе так можно поступить. И в данном случае следовало бы. Дело в том, что выражения, используемые для создания необходимой информации, представляют собой набор простых команд, которые выводят HTML-код. Его можно поместить в отдельный файл и включать в конце каждой страницы. Для этого даже не понадобится использовать дескрипторы РНР. Однако, предположим, что компания, для которой создается Web-узел, состоит из трех подразделений. И в информации, которая выводится внизу каждой страницы, необходимо также указать название подразделения и адрес электронной почты для переписки. Для этого можно было бы создать три различных файла включения и каждый раз использовать требуемый. Однако в данном случае решение на основе функций представляется более гибким и быстрым. Функции можно указать (т.е. передать ей значение (passing value)), информацию о каком подразделении требуется вывести. Например:

function add_footer($division)
{
     echo '<img src="greenrule.jpg" width="100%" height="7" />
     <address>Moя компания
     <br />ул. Прекрасная 1234
     <br />Сан Диего, СА 92126
     </address></font>
     <р>или обращайтесь в
     <а href="mailto:'.$division.'©company.com">' .$division.'</a>
     <img src="greenrule.jpg" width="100%" height="7" />';
     return;
}

В этом случае функция считывает значение параметра, которое содержится в параметре $division. Далее оно используется в теле функции для вывода нужной информации. При использовании функции add_footer() в качестве входного аргумента ей необходимо передать некоторое значение:

add_footer("Отдел продаж");

Для изменения информации о подразделении необходимо передать другой входной параметр:

add_footer("Бухгалтерия");

Обратите внимание на синтаксис функции echo. Строка заключена в одинарьые кавычки. В предыдущем примере, без переменных, одинарные кавычки использовались только в начале и в конце выводимой строки. В данном случае, при использовании переменной, строка заканчивается одинарной кавычкой перед переменной $division и снова открывается после. Запомните, что значение переменной в строке с одинарными кавычками не выводится. Если $division поместить в такую строку, то вместо строки Отдел продаж будет выведен текст $division.

Результатом выполнения функции также может быть некое возвращаемое значение (returning value). Для этого используется оператор return. Предположим, что в результате выполнения функции add_footer() информацию необходимо сохранить в переменной и не выводить на экран. Это можно осуществить следующим образом:

function add_footer($division)
{
     $str='<img src="greenrule.jpg" width="100%" height="7" />
     <p>'.$division. '</p>
     <address>Moя компания
     <br />ул. Прекрасная 1234
     <br />Сан Диего, СА 92126
     </address></font>
     <р>или обращайтесь в
     <а href="mailto:'.$division.'©company.com">' .$division.'</a>
     <img src="greenrule.jpg" width="100%" height="7" />';
     return $str;
}

И воспользоваться таким выражением:

$footer = add_footer("Отдел продаж");
echo $footer;

При выводе переменной $footer отобразится вся информация, сгенерированная в функции add_footer().

Далее в этом разделе подробно рассматриваются вопросы, связанные с созданием и использованием функций. Они позволяют быстро разработать выполняемый сценарий, который легко отлаживать и поддерживать. Именно поэтому высококлассные программисты всегда стараются использовать функции.


Использование переменных в функциях

В функциях можно создавать и использовать переменные, которые называются локальными (local). Эти переменные могут быть доступны только в теле функции. (Для того чтобы переменная была доступна извне, ее необходимо объявить глобальной (global), используя ключевое слово global.) Рассмотрим пример создания локальной переменной внутри функции:

function format_name($first_name, $last_name)
{
     $name = $last_name. ", ".$first_name;
}

Функцию format_name() можно вызвать, передав ей соответствующие значения, и попытаться вывести переменную $name:

format_name("Джесс", "Джонс");
echo "$name";

Однако в результате ничего выведено не будет, поскольку в переменной $name не содержится никакого значения. Эта переменная была создана внутри функции и не доступна из основного кода сценария.

Для того чтобы изменить эту ситуацию, необходимо объявить переменную глобальной. Рассмотрим измененный вариант предыдущего сценария:

function format_name($first_name, $last_name)
{
     global $name;
     $name = $last_name. ",".$first_name;
}

Теперь переменную $name можно использовать вне тела функции и вывести ее значение:

format_name("Джесс", "Джонс");
echo "$name";

В результате отобразится следующая информация:

Джонс, Джесс

Переменную обязательно необходимо объявить глобальной перед тем, как выполнять с ней какие-либо действия. Например, если бы ключевое слово global следовало после присваивания значения переменной $name, на экране ничего не отобразилось бы, т.е. функция и сценарий работали бы не корректно.

Аналогичным образом, если переменная объявлена вне тела функции, а затем переменная с тем же именем объявлена внутри функции, то внешняя переменная будет доступна внутри функции только в том случае, если в функции она объявлена глобальной. Для примера рассмотрим следующий фрагмент кода:

$first_name = "Джесс";
$last_name = "Джонс";
function format_name()
{
     global $first_name, $last_name;
     $name = $last_name. ", ".$first_name;
     echo "$name";
}
format_name();

Если при объявлении переменных $last_name и $first_name в теле функции не использовать ключевое слово global, созданные локальные переменные будут отличаться от глобальных. В таком случае они не будут иметь значений, и в результате вывода переменной $name получим запятую (,).

Для корректной работы функции format_name() необходимо использовать ключевое слово global.


Передача значений в функцию

Для передачи значений в функцию их необходимо заключить в скобки после имени функции:

имя_функции(значение1, значение2, ...);

Безусловно, переменные просто так ниоткуда не возьмутся, и их нужно предварительно задать. Это делается при определении функции с помощью ключевого слова function:

function имя_функции(значение1, значение2, ...)
{
     набор команд;
     return;
}


Передача значений корректного типа

При передаче значений в качестве аргументов можно использовать переменные любого типа, включая массивы или объекты (объекты в следующих разделах).

Следующее выражение вызывает функцию salestaxf(), которая вычисляет налог на продажу. Для этого необходимо знать сумму покупки и название штата (поскольку в paзных штатах установлены разные ставки), чтобы корректно определить сумму налога, т.е. функции salestaxt() нужно передать два аргумента: числового (сумма покупки) и строкового (название штата) типов. Рассмотрим некоторые примеры:

  • compute_salestax(2000, "CA");  Этой функции переданы два значения:2000 и СА (штат Калифорния).
  • compute_salestax(2*1000, ""); Этой функции переданы два 3начения: 2000 и "" (пустая строка). Функция должна уметь обрабатывать различные варианты входных данных, в том числе и пустую строку.
  • compute_salestax(2000, "С". "А"); Этой функции передано два значения: 2000 и "С". "А", что соответствует СА.

В качестве аргументов функции также можно передавать массивы. Рассмотрим следующий пример:

function add_numbers($numbers)
{
     for($i=0;$i<sizeof($numbers);$i++)
     {
          @$sum = $sum + $numbers[$i];
     }
     return $sum;
}

Эта функция позволяет вычислить сумму элементов массива. Если же переданная переменная не является массивом, интерпретатор РНР преобразует ее к нужному типу: числу или строке. Однако при выполнении функции sizeof($numbers) произойдет ошибка, поскольку в качестве входного параметра она использует массив. Поэтому хорошо написанная функция должна проверять переданную ей информацию. Например, в предыдущее выражение перед циклом for можно добавить следующее:

if(!is_array($numbers)
{
     echo "Переданная переменная не является массивом";
     exit();
}

Точно так же эта функция должна проверить, что элементы массива являются числами. Рассмотрим пример использования созданной функции add_number():

$arrayofnumbers = array(100,200);
$total = add_numbers($arrayofnumbers);

В результате переменная $total станет равной 300.


Передача значений в корректном порядке

Функция получает значения в том порядке, в котором они ей передаются. Рассмотрим следующий пример:

function functionx($x, $y, $z)
{
     выполнение некоторых действий
}

Осуществим вызов этой функции:

functionx($varl, $var2, $var3);

При этом происходит следующее: переменной присваивается переданное значение $var1; переменной — значение $var2 и переменной $z$var3.

Если при вызове функции порядок переданных аргументов не соответствует тому, который использовался при определении, — возникает ошибка. Рассмотрим, например, определение функции, которая вычисляет налог на продажу:

function compute_salestax($orderCost, $custState)
{
     вычисление налога
}

Предположим, осуществляется ее вызов:

compute_salestax($custState, $orderCost);

В этом случае переданное название штата используется в качестве суммы покупки, и интерпретатор РНР присваивает этой переменной нулевое значение (преобразует строку в число). То же происходит и с переменной, соответствующей сумме покупки. В результате будет получено значение 0.


Передача корректного количества переменных

При вызове функции ей необходимо передать определенное количество переменных. Если одна из них пропущена, ей присваивается значение NULL. Если интерпретатор РНР настроен на обработку ошибок, то будет выведено соответствующее сообщение. Рассмотрим следующий пример вывода сообщения об ошибке:

Warning: Missing argument 2 for format_name() in testing.php on line 9
(Предупреждение: Отсутствует аргумент 2 функции format_name() в файле testing.php в строке 9)

Помните, что предупреждения (warning) не останавливают выполнение сценария. Предположим теперь, что осуществляется вызов функции format_name(), рассмотренной выше в этом разделе:

format_name("Джесс");

В результате получим:

Джесс,

Если функции передать слишком много аргументов, лишние из них будут проигнорированы. Однако такая ситуация возникает редко.

Переменным, значения которых передаются в функцию, можно присвоить значения по умолчанию (т.е. если аргумент не передан, используется значение по умолчанию). Они присваиваются при определении функции:

function add_2_numbers($num1=1, $num2=1)
{
     $total = $num1 + $num2;
     return $total;
}

Однако если при вызове функции указано значение параметра, то именно оно используется вместо значения по умолчанию. Рассмотрим различные примеры вызова функции add_2_number():

add_2_numbers(2,2);
add_2_numbers(2);
add_2_numbers();

Будут получены следующие результаты:

$total = 4
$total = 3
$total = 2

Первый результат ($total=4) получен путем сложения двух переданных значений, равных 2. Второй ($total=3) — путем сложения числа 2 и значения по умолчанию 1, используемого для переменной $num2. Третий ($total=2)— путем сложения двух значений, по умолчанию равных 1, используемых для $num1 и $num2.


Передача значений по ссылке

Если при определении функции используется передача значений, то такой подход называется передачей аргументов по значению. Такой подход применяется чаще всего, как, например, в следующем выражении:

function add_1($num1)
{
     $num1 = $num1 + 1;
}

При передаче аргументов по значению переданное значение копируется в локальную переменную, которая и используется в теле функции. В данном случае таковой является $num1, к которой прибавляется 1. Однако значение переменной вне функции (т.е. переменной, которая используется при вызове) не изменяется. Рассмотрим следующий пример:

$orig_num = 3;
add_1($orig_num);
echo $orig_num;

В результате вывода получим 3. При вызове функции add_1() значение переменной $orig_num будет скопировано в переменную $num1. При этом никакие действия над $orig_num осуществляться не будут. Для того чтобы изменить ее значение, необходимо добавить в определение функции следующее выражение:

return $num1;

Переменной $orig_num можно присвоить результат выполнения функции add_1():

$orig_num =3;
$orig_num = add_1($orig_num);
echo $orig_num;

Теперь результатом вывода будет 4.

Однако в некоторых случаях необходимо изменить значение переменной напрямую. Предположим, в предыдущем примере к переменной $orig_name нужно прибавить 1 без создания локальной копии. В этом простом примере, безусловно, можно воспользоваться глобальной переменной, но это также можно осуществить, используя передачу по ссылке (passing by reference). Для этого при определении функции необходимо добавить знак амперсанта (&) перед именем переменной:

function add_1(&$num1)
{
     $num1 = $num1 + 1;
}

При вызове этой функции в качестве аргумента передается не значение, а адрес, по которому хранится переменная (т.е. указатель контейнера с именем $orig_num, где содержится значение 3). Переменная $num1 становится псевдонимом $orig_num, так как если переменной $num1 присвоить некоторое значение, оно же будет присвоено и $orig_num. Эти переменные указывают на один и тот же адрес памяти, где хранится значение. Если изменить значение локальной переменной в теле функции, эти же изменения произойдут и с внешней (по отношению к функции) переменной. Рассмотрим следующий пример вызова функции:

$orig_num = 3;
add_1(&$orig_num);
echo $orig_num;

В результате вывода получим 4.

Следующее выражение, использующее передачу аргумента по ссылке, не имеет смысла:

add_1(&7);

Передача по ссылке главным образом используется для передачи больших сущностей, таких как объекты или массивы, поскольку пи таком подходе требуется гораздо меньше памяти.


Возвращаемое значение функции

Для возвращения значения функции в языке РНР используется оператор return. Это значение затем может обрабатываться различными способами. Оператор return возвращает некоторое значение и выполняет переход к основному коду сценария. Общий синтаксис этого оператора имеет следующий вид:

return значение;

Рассмотрим такой пример:

function add_2_numbers($num1, $num2)
{
     $total = $num1 + $num2;
     return $total;
}

Эта функция возвращает сумму двух значений. Рассмотрим пример ее вызова:

$sum = add_2_numbers(5, 6);

В этом примере значение локально созданной переменной $total , равное 11, будет присвоено переменной $sum. Фактически при определении функции можно использовать сокращенную запись, например:

return $num1 + $num2;

При этом возвращаемое значение функции можно использовать в различных выражениях. Рассмотрим некоторые примеры:

$total_height = add_2_numbers($height1, $height2);
$totalSize = $current_size + add_2_numbers($size1, $size2);
if (add_2_numbers($costSocks, $costShoes) > 200.00 )
     $echo "Дорого";

При этом следует заметить, что оператор return позволяет возвращать только одно значение, которым, однако, может быть и массив. Поэтому, в принципе, функция может возвращать несколько значений. Выражение return также можно использовать в условных выражениях:

function find_value($array, $value)
{
     for($i=1;$i<sizeof($array);$i++)
     {
          if($array[$i] = $value)
          {
               echo "$i. $array[$i]<br>";
               return ;
          }
     }
}

Функция find_value() проверяет, содержит ли массив $аrrау значение $value. Рассмотрим пример вызова этой функции:

$names = array("Джо", "Сэм", "Хуан");
find_value($names, "Сэм");

Функция ищет среди элементов массива значение Сэм. Если соответствующий элемент найден, выводится его индекс и функция завершает свою работу:

1. Сэм

Очень часто функции возвращают булевы значения, как, например, в выражении:

function is_over_100($number)
{
     if($number > 100)
     {
          return TRUE;
     }
     else {
          return FALSE;
     }
}

Если значение переменной $number меньше или равно 100, возвращается значение FALSE, в противном случае — TRUE. Рассмотрим еще один пример создания функции, в котором она возвращает некоторое значение в случае успешного выполнения и значение FALSE в противном случае:

function find_value($array, $value)
{
     for($i=1; $i<sizeof($array); $i++)
     {
          if($array[$i] == $value)
          {
               return $i;
          }
     }
     return FALSE;
}

Если нужное значение найдено в массиве, будет возвращен индекс элемента, в противном случае — значение FALSE.


Использование встроенных функций

В языке РНР имеется большой набор мощных и полезных встроенных функций, что является одной из причин его чрезвычайной популярности. Они используются наряду со стандартными функциями и ничем не отличаются от пользовательских. В них воплощена работа, которую разработчики РНР сделали за вас. Например:

isset($varname)
empty($varname)

Весь список встроенных функций можно найти в документации РНР на официальном Web-узле (www.php.net/docs.php).

Обработка ошибок

Как это ни печально, иногда функции работают некорректно. Как бы вы не старались учесть все возможные варианты ошибок, что-то все-таки может не сработать. Например, функция подключения к базе данных может функционировать неправильно, если база данных в данный момент недоступна. Причем это не связано с тем, что в функции содержатся ошибки, — так сложилась ситуация. Хорошо написанная функция должна предвидеть все возможные ситуации и возвращать в таких случаях значение FALSE.

Сценарий должен предвидеть любые ошибки, связанные с работой функций, и соответствующим образом обрабатывать их. Лучше вывести пользователю собственноручно созданное сообщение, чем стандартное предупреждение, сгенерированное РНР. Для этого в РНР предусмотрена функция die(). Ее общий синтаксис имеет следующий вид:

die("сообщение");

Функция die() позволяет прервать выполнение сценария и вывести соответствующее сообщение. С функциями ее необходимо использовать следующим образом:

имя_функции() or die("сообщение");

Если в результате выполнения функции будет получено значение FALSE, функция die() прервет выполнение сценария и выведет сообщение.

Рассмотрим пример, в котором выполняется подключение к базе данных MySQL:

mysql_connect("host", "user", "password")
     or die("База данных не доступна. Попробуйте подключиться позже.);

Необходимо помнить следующее. Если функция работает некорректно, интерпретатор РНР сгенерирует сообщение об ошибке. Если вместо него необходимо вывести свое сообщение, следует изменить уровень вывода ошибок или не выводить их вообще. Иначе будут выведены оба сообщения.

Функцию die() можно использовать с любой другой функцией. Однако ее не имеет смысла применять в тех случаях, когда функция возвращает значение FALSE. Помните, что die() полностью останавливает выполнение сценария.

Предотвратить некорректную работу функции можно, используя ее вызов в условном выражении. К результату, полученному в предыдущем примере, можно прийти с помощью следующего выражения:

if(!mysql_connect("host", "user", "password"))
{
     echo "База данных недоступна. Попробуйте подключиться позже\n";
     exit();
}

Обратите внимание на восклицательный знак перед вызовом функции mysql_connect(). Он используется для следующего: если не удается подключиться к базе данных (т.е. будет возвращено значение FALSE), условное выражение станет истинным (TRUE) и будет выведено соответствующее сообщение.

При этом функция exit не выполняет те же действия, что и die. Помните, что любое из этих выражений можно использовать в операторе if. Можно даже написать сценарий, который в случае ошибки при подключении к базе данных будет отправлять письмо по электронной почте.

Форма входа

Мини-чат

Календарь новостей
«  Май 2024  »
ПнВтСрЧтПтСбВс
  12345
6789101112
13141516171819
20212223242526
2728293031

Поиск

Друзья сайта
Скажи сайту спасибо
ЯндексЯндекс. ДеньгиХочу такую же кнопку



Получить WMR-бонус на свой кошелек!

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Copyright MyCorp © 2024 Бесплатный конструктор сайтов - uCoz