 | Функции
Создание функций
Когда вы разрабатываете значительную по размеру программу, то в ней, как правило, есть сегменты кода, которые выполняются несколько раз. Кроме того, выделение фрагментов, отвечающих за определенные действия, делает программу более прозрачной, ее будет легче читать и модифицировать.
Именно для этих целей и служат функции. Например, вы можете выделить проверку пароля в отдельную функцию:
...
<body>
<p>You entered:</p>
<?php
function checkPasswords($firstPass, $secondPass){
if ($firstPass == $secondPass) {
echo "<p>Passwords match. Thank you.</p>";
} else {
echo "<p>Passwords don't match. \
Please try again.</p>";
}
}
foreach ($_POST as $key=>$value) {
echo "<p>".$key." = " . $value . "</p>";
}
$passwords = $_POST["pword"];
echo "First password = ".$passwords[0];
echo "<br />";
echo "Second password = ".$passwords[1];
?>
</body>
</html>
|
Когда сервер будет обрабатывать эту страницу и дойдет до ключевого слова function, он пропустит следующий блок, поскольку функции выполняются только по специальному запросу, и перейдет непосредственно в выполнению цикла foreach, как можно видеть ниже на Рисунке 11.
Рисунок 11. Выполнение цикла foreach
| XML error: The image is not displayed because the width is greater than the maximum of 500 pixels. Please decrease the image width. |
Для того чтобы использовать функцию, ее надо вызвать.
Вызов функции
Вызов функции состоит из указания ее имени, следом за которым должна идти пара круглых скобок. В том случае, если функция принимает какие-либо параметры, их помещают в скобках через запятую, например:
...
<body>
<p>You entered:</p>
<?php
function checkPasswords($firstPass, $secondPass){
if ($firstPass == $secondPass) {
echo "<p>Passwords match. Thank you.</p>";
} else {
echo "<p>Passwords don't match. Please try again.</p>";
}
}
foreach ($_POST as $key=>$value) {
echo "<p>".$key." = " . $value . "</p>";
}
$passwords = $_POST["pword"];
echo "First password = ".$passwords[0];
echo "<br />";
echo "Second password = ".$passwords[1];
checkPasswords($passwords[0], $passwords[1]);
?>
</body>
</html>
|
Когда PHP выполняет эту страницу, то описание функции пропускается, выполняется цикл foreach, выводятся значения паролей, затем вызывается функция
checkPasswords() с двумя аргументами. (В качестве аргумента можно было передать и массив, тогда выделение индивидуальных значений нужно было бы сделать внутри функции.)
Рисунок 12. Выполнение функции checkPasswords() после цикла foreach
| XML error: The image is not displayed because the width is greater than the maximum of 500 pixels. Please decrease the image width. |
Если у вас есть опыт программирования на других языках, то вы могли заметить, что это больше похоже на работу процедуры, а не функции, поскольку произошли некоторые действия, а главным признаком функции является то, что она возвращает некоторое значение. В PHP функции используются в обоих этих ролях.
Возвращаемые значения
Кроме задачи выполнения некоторого сегмента кода, функции могут возвращать некоторые значения.
Например, создадим функцию полной проверки правильности ввода данных таким образом, чтобы она возвращала одно значение в случае успеха и другое при наличии ошибок:
...
<body>
<p>You entered:</p>
<?php
function validate($allSubmitted){
$message = "";
$passwords = $allSubmitted["pword"];
$firstPass = $passwords[0];
$secondPass = $passwords[1];
$username = $allSubmitted["name"];
if ($firstPass != $secondPass) {
$message = $message."Passwords don't match<br />";
}
if (strlen($username) < 5 || strlen($username) > 50){
$message = $message."Username must be \
between 5 and 50 characters<br />";
}
if ($message == ""){
$message = "OK";
}
return $message;
}
...
|
В качестве аргумента функция будет принимать массив $_POST и выбирать из него информацию для проверки. В начале работы функции мы создаем пустую строку сообщений $message. Если пароль введен с ошибкой или нас не устраивает длина имени пользователя
(для проверки имени использовалась функция strlen(), которая возвращает количество символов в строке), то в переменную
$message добавляется некоторый текст.
Если же все прошло успешно, то строка остается пустой и мы записываем в нее сообщение "OK", далее, при вызове функции мы будем проверять наличие именно этого сообщения.
Проверка данных
Итак, мы написали функцию, которая проверяет данные и возвращает некоторое значение. Посмотрим теперь, как можно использовать это значение:
...
echo "<br />";
echo "Second password = ".$passwords[1];
if (validate($_POST) == "OK") {
echo "<p>Thank you for registering!</p>";
} else {
echo "<p>There was a problem with your registration:</p>";
echo validate($_POST);
echo "<p>Please try again.</p>";
}
?>
...
|
В условном операторе if-then одновременно вызывается функция validate() и проверяется возвращаемое ею значение. Если проверка прошла успешно, то пользователю говорят "спасибо", а если нет -- то выводится сообщение об ошибке, как можно видеть ниже на Рисунке 13.
Рисунок 13. Вывод сообщения об ошибке
| XML error: The image is not displayed because the width is greater than the maximum of 500 pixels. Please decrease the image width. |
Сделаем два замечания. Во-первых, мы надеемся, что вы оценили удобство использования функции, которая позволяет свести всю проверку к одной легко читаемой строке вместо сложной конструкции из нескольких операторов if-then. Во-вторых, заметьте, что использование функции здесь не оптимально, она вызывается дважды с одними и теми же параметрами. В большой программе это может привести к существенному снижению продуктивности, правильнее было бы вызвать функцию один раз и присвоить возвращаемое значение некоторой переменной.
Теперь наши данные готовы для записи их в базу данных.
|  |