Сегодня: Воскресенье
19-е Апреля
2026-го года.
Сейчас: 22:18:06
 

N1

ГлавнаяN1Pol_ssAboutLitraJava
ЗЯВА мы с вами надолго
 
Тут находиться копия текста из книги Джанет`a Валейд`a. с использованием на практике сценариев.

Глава 4 Глава 5 Глава 6 Глава 7 Глава 8 Глава 9

Глава 8

Повторное использование кода в сценариях РНР

В этой главе...

Включение файлов в сценарии
Вопросы безопасности, связанные с включением файлов
Создание функций
Использование функций

 

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

    Меньше работы — это всегда стимулирует.
Отладка осуществляется один раз. Можно написать код один раз, проверить его работоспособность, а затем использовать столько, сколько потребуется. Редко удается сразу переписать код без каких-либо опечаток, не говор я уже о том, чтобы написать новый. Его всегда нужно проверять. Поэтому использование готового проверенного кода позволяет сэкономить много времени
    Простота понимания. Чем меньше кода, тем более простым и читаемым является сценарий. Например, одну строку кода, содержащую функцию get -Data(), проще понять, чем, скажем, десять срок, которые реально используются для получения данных.
    Простота поддержки. Если необходимо внести какие-то изменения в сценарий, то при повторном использовании кода их нужно будет внести всего один раз во внешнем файле. В противном случае пришлось бы искать нужный фрагмент кода везде, где он используется, и изменять его оответствующим
образом. Например, если поменяется имя базы данных, то куда практичней будет внести изменения один раз в одном файле, чем во всех частях, где используется ее имя.

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

Включение кода в сценарий

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

Включение файлов

Предположим, что вы создаете интерактивный каталог товаров и что ваше приложение содержит большое количество страниц, отражающих его содержимое. Размеры изображений (ширина и высота) можно задать как константы, а затем использовать их в дескрипторах HTML для вывода изображений. Таким образом, все картинки будут одинакового размера. Впоследствии можно изменять размеры изображений путем простой замены значений констант. При этом отпадает необходимость вносить изменения в каждый дескриптор <img> сценария. Создать константы можно следующим образом:
define("HEIGHT", 60);
define("WIDTH", 60);

Затем их можно использовать в HTML-дескрипторах:
<img src="mypic.jpg" height="<?php echo HEIGHT?>"
width="<?php echo WIDTH?>" />;

Если изображения товаров выводятся в разных файлах сценария, нет необходимости в каждом из них размещать определения констант. Константы можно объявить в одном файле, например size.inc (это расширение обычно используется для файлов включения), а затем включать его в сценарий там, где это будет нужно:
<?php
define("HEIGHT", 60);
define("WIDTH", 60);
?>

Теперь для включения файла следует воспользоваться выражением
include("size.inc") ;

<? include("size.inc") ; ?>
<img src="mypic.jpg" height="<?php echo HEIGHT?>"
width="<?php echo WIDTH?>"

При обработке этого фрагмента кода интерпретатор РНР считывает команды данного файла и вставляет его в исходный файл вместо инструкции include, т.е. HTML-дескрипторы, содержащие константы HEIGHT и WIDTH, будут отображаться следующим образом:
<img src="mypic.jpg" height="60" width="60" />

Таким образом, на Web-странице будет выведена картинка. Если необходимо автоматически изменить размеры всех изображений, следует один раз поменять значения констант HEIGHT и WIDTH. Поскольку дескриптор<img> является достаточно сложным и содержит большой набор параметров, его можно поместить в отдельный файл, скажем displayPix.inc, и включать при выводе изображений. При этом сам <img> -дескриптор можно поместить в файл displayPix.inc, константы — в файл size.inc, а затем оба файла включить в результирующий сценарий либо включить файл size.inc в displayPix.inc, а затем использовать только displayPix.inc.

Зачастую разработчики забывают использовать дескрипторы РНР. Это одна из наиболее частых ошибок, которая связана с вопросом безопасности, поскольку без PHP-дескрипторов содержимое страницы будет без обработки выведено на экран. Безусловно, если пользователь знает размеры изображений, это не создаст проблем. Но, если в файле будет содержаться, например, пароль для доступа к базе данных, это может иметь нежелательные последствия.

Вместо функции include() можно использовать выражение:
include_once("имя_файла") ;

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

В языке РНР имеются также функции require() и require_once(), которые подобны include(), но отличаются способом обработки ошибок. Это различие проявляется, например, при обращении к файлу, которого не существует. В этом случае функция require() выдаст ошибку и сценарий остановится. При использовании include() будет выведено только сообщение об ошибке, но сценарий продолжит выполняться.

В качестве имен файлов также можно использовать значения переменных:
include("$filename");

Например, необходимо вывести различные сообщения в зависимости от дня недели. Приэтом сообщения находятся в файлах, имена которых соответствуют различным дням. Например, файл с именем Sun.inc может содержать следующее:
echo "Думайте о будущем. Отсыпайтесь. Сегодня - никакой работы.";

И другие файлы в том же духе. Следующий фрагмент кода позволяет корректно вывести нужное сообщение в зависимости от дня недели:
$today = date("D") ;
include("$today"."inc") ;

В результате выполнения функции date() (см. главу 5) переменной $today будет присвоено сокращенное название дня недели. Вторая строка позволяет подключить необходимый файл. Например, если $today равно Sun (воскресенье), то будет выведено сообщение, содержащееся в файле Sun.inc.

Размещение файлов включения

Размещение файлов включения при разработке Web-страниц является важным вопросом, особенно с точки зрения обеспечения безопасности. Если файл никоим образом не защищен, его сможет загрузить любой пользователь. Теоретически это можно сделать, используя следующий адрес:
http://yourdomain.com/secretpasswords.inc

Предположим, что в Web-окружении имеется файл secretpassword.inc, который содержит следующую информацию:
<?php
$mysecretaccount="account48756";
$mypassword="secret" ;
?>

В большинстве случаев Web-серверы не настроены на обработку PHP-кода в файлах с расширениями, отличными от .рhр, т.е. интерпретатор РНР не обрабатывает файл secretpassword.inc, и его содержимое будет отображено пользователю как HTML-код. что явно не желательно. Для защиты от подобных случаев можно предпринять одно из следующих действий.

    Переименовать файл включения с расширением .php. В таком случае Web-сервер будет обрабатывать файл включения так же, как и обычный сценарий РНР. Но тогда следует хорошенько подумать о его содержимом. Дело в том, что независимая обработка отдельных файлов включения крайне нежелательна. Предположим, например, что файл включения предназначен для удаления записи в базе данных (что, правда, маловероятно). Тогда независимая обработка такого файла (отдельно от файла сценария) может иметь негативные последствия. Еще одним фактором является то, что расширение файла .inc явно указывает, что он вспомогательный и предназначен для включения, а не для отдельной обработки.
Настроить Web-сервер на обработку кода РНР не только в файлах с расширением .php, но и в других файлах, например с расширением .inc. Этот подход позволит отличить файлы по их функциональному назначению. Однако все равно остается проблема, связанная с независимой обработкой файлов включения.
    Разместить файл в месте, недоступном извне. Это решение является наиболее предпочтительным. Хотя оно не всегда реализуемо, например при использовании услуга Web-хостинговой компании.

Наилучшим вариантом является размещение файлов в каталогах, недоступных извне. Другими словами, необходимо создать каталоги для файлов включения, к которым невозможно будет получить доступ из Web-окружения. Например, Web-сервер Apache по умолчанию сохраняет файлы для Web в каталоге apache/htdocs (хотя этот путь можно изменить в конфигурационном файле httpd.conf). Поэтому для защиты файлов включения от внешнего доступа их можно разместить, например, в каталоге d:\include.

Установка путей для файлов включения

Модуль РНР позволяет задать специальные пути, которые будут использоваться для загрузки файлов включения. Если вы являетесь администратором этого модуля, это можно очень просто сделать в файле конфигурации php.ini (этот файл размещается в системном каталоге, как описано в приложении А). Для этого необходимо найти строку, содержащую директиву include_path, и изменить указанное в ней значение. Если в начале этой строки находится точка с запятой, ее необходимо удалить. Рассмотрим следующие примеры:
include_path=".;d:\include"; # для Windows
include_path=".:/user/local/include"; # для Unix/Linux/Mac

Обе эти строки определяют каталоги, в которых интерпретатор РНР будет искать файлы включения. Первое значение (символ точки) соответствует текущему каталогу, за которым следует имя второго каталога. РНР позволяет определить столько каталогов, сколько требуется. При этом порядок проверки каталогов на наличие файлов включения соответствует порядку значений, указанному в директиве include_path. Разделителем этих значений для операционных систем Windows является точка с запятой и двоеточие — для Unix/Linux.

Если же вы не имеете доступа к конфигурационному файлу php.ini, этот путь можно установить отдельно для каждого сценария следующим образом:
ini_set("include_path", "d:\hidden");

Это выражение присваивает переменной include_path определенное значение только на время выполнения сценария. Оно не устанавливает его для всего Web-окружения.

Для доступа к файлу включения по установленному пути необходимо использовать его имя. При этом полный путь указывать не обязательно:
include("secretpasswords.inc");

Если необходимый файл не содержится по адресу, указанному в директиве include_path или в том же каталоге, что и сам сценарий (например, в подкаталоге или каталоге, скрытом от Web-окружения), следует указать полный путь:
include ("d: /hidden/secretpasswords.inc") ;

В остальных случаях будет достаточно одного имени файла.

Создание повторно используемого кода (Функции)

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

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

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" />';
Moя компания
ул. Прекрасная 1234
Сан Диего, СА 92126

или обращайтесь в отдел продаж

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

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

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

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

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

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

?>
<?
add_footer();
add_footer();
add_footer();
add_footer();
?>
Moя компания
ул. Прекрасная 1234
Сан Диего, СА 92126

или обращайтесь в отдел продаж

Moя компания
ул. Прекрасная 1234
Сан Диего, СА 92126

или обращайтесь в отдел продаж

Moя компания
ул. Прекрасная 1234
Сан Диего, СА 92126

или обращайтесь в отдел продаж

Moя компания
ул. Прекрасная 1234
Сан Диего, СА 92126

или обращайтесь в отдел продаж

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

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

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

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

?>
<?
add_footerr("Отдел продажжжжжжжжж");
add_footerr("Бухгалтерия");

?>

Отдел продажжжжжжжжж

Moя компания
ул. Прекрасная 1234
Сан Диего, СА 92126

или обращайтесь в отдел продаж

Бухгалтерия

Moя компания
ул. Прекрасная 1234
Сан Диего, СА 92126

или обращайтесь в отдел продаж

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

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

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

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

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

Отдел продаж

Moя компания
ул. Прекрасная 1234
Сан Диего, СА 92126

или обращайтесь в Отдел продаж

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

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

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

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

<?
function format_name($first_name, $last_name)
{
$name = $last_name. ", ".$first_name;
}
format_name("Джесс", "Джонс");
echo "$name";//попытка вывести локальную переменную
?>
в результате:

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

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

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

<?
function format_name1($first_name, $last_name)
{
global $name;
$name = $last_name. ", ".$first_name;
}
format_name1("Джесс", "Джонс");
echo "в результате:"."$name"; //попытка вывести глобальную переменную
?>

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

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

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

<?
$first_name = "Джесс";
$last_name = "Джонс";
function format_name2()
{
global $first_name, $last_name;
$name = $last_name. ", ".$first_name;
echo "$name";
}
format_name2();
?>
Джонс, Джесс
<?
$first_name = "Джесс";
$last_name = "Джонс";
function format_name3()
{
//global $first_name, $last_name; (код не вып.)
$name = $last_name. ", ".$first_name;
echo "$name";
}
format_name3();
?>
,

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

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

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

Для передачи значений в функцию их необходимо заключить в скобки после имени функции:
имя_функции(значение!, значение2, ...);

Безусловно, переменные просто так ниоткуда не возьмутся, и их нужно предварительно задать. Это делается при определении функции с помощью ключевого слова function:
function имя_функции(значение1, значение2, ...)
{
набор команд;
return;
}

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

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

<?
function xqwa($x)
{
global $res;
$res = $x*$x;
return ;

}
xqwa(4);
echo $res;
?>
16

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

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

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

<?
function add_numbers($numbers)
{
for($i=0;$i < sizeof($numbers);$i++)
{
@$sum = $sum + $numbers[$i];
}
return $sum;
}
$nn = array(4,3,2,1,0);
$ress = add_numbers($nn);
echo "$ress";
?>
10

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

<?
function add_numbers1($numbers)
{
if(!is_array($numbers))
{
echo "Переданная переменная не является массивом";
//exit();
return;
}
for($i=0;$i < sizeof($numbers);$i++)
{
@$sum = $sum + $numbers[$i];
}
return $sum;
}
$nn = 4;
$ress = add_numbers1($nn);
echo "$ress";
?>
Переданная переменная не является массивом

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

<?
function add_numbers2($numbers)
{
if(!is_array($numbers))
{
echo "Переданная переменная не является массивом"."<br>";
//return;
}
if(!is_int($numbers))
{
echo "Переданная переменная не является числом"."<br>";
//return;
}
for($i=0;$i < sizeof($numbers);$i++)
{
@$sum = $sum + $numbers[$i];
}
return $sum;
}
$nn = "pap";
$ress = add_numbers2($nn);
echo "$ress";
?>

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

Функция получает значения в том порядке, в котором они ей передаются. Рассмотрим следующий пример:
function functionx($x, $y, $z)
{
выполнение некоторых действий
}

Осуществим вызов этой функции:
functionx($var1, $var2, $var3);

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

Если при вызове функции порядок переданных аргументов не соответствует тому, который использовался при определении, — возникает ошибка. Рассмотрим, например, определение функции, которая вычисляет налог на продажу:
function compute_salestax($orderCost, $custstate)
{
вычисление налога
}

Предположим, осуществляется ее вызов:
compute_salestax($custState, $orderCost);

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

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

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

<?
format_name1(1);
echo "в результате:"."$name"; ?>

PHP Warning: Missing argument 2 for format_name1(), called in C:\Site\localhost\www\ss1_4.php on line 727 and defined in C:\Site\localhost\www\ss1_4.php on line 423
 (Предупреждение: Отсутствует аргумент 2 функции format_name() в файле ss1_4.php в строке 727)

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

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

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

<?
function add_2_numbers($numl=1, $num2=1)
{
$total = $numl + $num2;
return $total;
} ?>

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

<? $ress = add_2_numbers(2, 2); echo $ress; ?> 4
<? $ress = add_2_numbers(2); echo $ress; ?> 3
<? $ress = add_2_numbers(); echo $ress; ?> 2

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

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

Если при определении функции используется передача значений, то такой подход называется передачей аргументов по значению. Такой подход применяется чаще всего, как, например, в следующем выражении:
function add_1($num1)
{
$num1 = $num1 + 1;
}

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

<?
function add_1($num1)
{
$num1 = $num1 + 1;
}
$orig_num = 3;
add_1($orig_num);
echo $orig_num; ?>
3

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

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

<?
function add_2($num1)
{
$num1 = $num1 + 1;
return $num1;
}
$orig_num = 3;
$orig_num = add_2($orig_num);
echo $orig_num; ?>
4

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

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

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

<?

function add_3(&$num1)
{
$num1 = $num1 + 1;
}
$orig_num = 3;
add_3(&$orig_num);
echo $orig_num; ?>

4

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

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

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

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

Для возвращения значения функции в языке РНР используется оператор return. Это значение затем может обрабатываться различными способами.

Оператор return возвращает некоторое значение и выполняет переход к основному коду сценария. Общий синтаксис этого оператора имеет следующий вид:
return значение;

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

<? function add_3_numbers($num1, $num2)
{
$total = $num1 + $num2;
return $total;
} ?>

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

<? $sum = add_3_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 позволяет возвращать только одно значение, которым, однако, может быть и массив. Поэтому, в принципе, функция может возвращать несколько значений.


<? function my_owen_func($n1,$n2,$n3)
{
$nn1[0] = $n1*$n2;
$nn1[1] = $n1/$n3;
return $nn1;
} ?>
<pre>
<? $test = my_owen_func(3,2,9);
var_dump($test); ?></pre>
array(2) {
  [0]=>
  int(6)
  [1]=>
  float(0.3333333333333333)
}

Выражение 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;
}
} $tt = is_over_100(101); echo $tt; ?>
1

Если значение переменной $number меньше или равно 100, возвращается значение FALSE, в противном случае — TRUE.

Рассмотрим еще один пример создания функции, в котором она возвращает некоторое значение в случае успешного выполнения и значение FALSE в противном случае:

<? function find_value1($array, $value)
{
for($i=1;$i<sizeof($array);$i++)
{
if($array[$i] == $value)
{
return $i;
}
}
return FALSE;
} ?>
<? $names = array("Джо", "Сэм", "Хуан");
$tt = find_value1($names, "Сэмм");
if($tt == false){ echo "0";} else {
echo $tt; }?>
0

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

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

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

Специализированные встроенные функции описываются в соответствующих главах, в которых рассказывается, чем они могут быть полезны многим разработчикам. В данном разделе они бы выпадали из контекста. Например, в главе 7 рассматривались функции, которые используются для проверки существования переменной или ее значения. Они имеют следующий вид:
isset($varname)
empty($varname)

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

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

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

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

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

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

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

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

<?
mysql_connect("127.0.0.1", "root", "password") or die("База данных не доступна. Попробуйте подключиться позже.") ;
?>
Необходимо помнить следующее. Если функция работает некорректно, интерпретатор РНР сгенерирует сообщение об ошибке. Если вместо него необходимо вывести свое сообщение, следует изменить уровень вывода ошибок или не выводить их вообще (см. главу 4). Иначе будут выведены оба сообщения.

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

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

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

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Глава 4 Глава 5 Глава 6 Глава 7 Глава 8 Глава 9


Март 2026 г
ПнВтСрЧтПтСбВс
09      1
102345678
119101112131415
1216171819202122
1323242526272829
143031     
Апрель 2026 г
ПнВтСрЧтПтСбВс
14  12345
156789101112
1613141516171819
1720212223242526
1827282930   
Май 2026 г
ПнВтСрЧтПтСбВс
18    123
1945678910
2011121314151617
2118192021222324
2225262728293031
Заварзинп
fenita la comedia c 2026
ЗЯВА