IBM®
Перейти к тексту
    в России и странах СНГ [изменить]    Условия использования
 
 
   
    Главная страница    Продукты    Услуги и решения    Поддержка и загрузка    Мой профиль    
Перейти к тексту

developerWorks Россия  >  Open source  >

Изучаем PHP: Часть 1. Страница регистрации, формы и взаимодействие с базой данных

developerWorks
На предыдущую страницуСтраница 4 из 10 На предыдущую страницу

Опции документа

Обсудить


Выскажите мнение об этом учебном пособии

Помогите нам улучшить содержание


Функции

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

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

Именно для этих целей и служат функции. Например, вы можете выделить проверку пароля в отдельную функцию:


...
<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. Во-вторых, заметьте, что использование функции здесь не оптимально, она вызывается дважды с одними и теми же параметрами. В большой программе это может привести к существенному снижению продуктивности, правильнее было бы вызвать функцию один раз и присвоить возвращаемое значение некоторой переменной.

Теперь наши данные готовы для записи их в базу данных.



В начало



На предыдущую страницуСтраница 4 из 10 На предыдущую страницу
    IBM в России Конфиденциальность Контакты