Комментарии

Применение нелогических значений в условных операторах if языка РНР
( 1 Проголосовало )

Начинающим программировать на РНР применение нелогических значений переменных, отличающихся от true или false, в условных операторах if может показаться не совсем понятным. Например, переменная $result в операторе if ($result) совсем не обязательно должна содержать логическое значение. И если это значение не является логическим, то оно сначала преобразуется в логическое значение, а затем вычисляется.

Когда переменная $result содержит любые данные, кроме нулевого или пустого значения, ее содержимое определяется как логическое значение true, и поэтому далее выполняется кодовый блок, следующий после условного оператора if. Так, если переменная $result содержит объект или массив, ее содержимое определяется как логическое значение true независимо от хранящихся в ней данных.

Например, присваивание $result = $db->loadObject () вполне допустимо, поскольку метод loadObject () возвращает объект или логическое значение false. Если он возвращает объект, то последний всегда определяется как логическое значение true в условном операторе if. Таким образом, мы можем выяснить, получен ли достоверный результат запроса базы данных или ошибка.

Обрабатывая нулевые или пустые значения, следует, однако, не терять бдительность, чтобы не попасть в следующую западню. Если, например, метод может возвратить нулевое значение как достоверное, но возвращает логическое значение false, указывающее на возникновение ошибки, то код if (! $result) не сможет проверить наличие этой ошибки. Когда возвращается нулевое значение, содержимое переменной $result определяется как логическое значение false, и поэтому результат обратного выражения ! $result вычисляется как логическое значение true. И следующий далее кодовый блок будет выполняться, как будто никакой ошибки не произошло, хотя на самом деле она возникла.

Аналогичным образом неправильно сработает условный оператор if ($result == false). И хотя это не так очевидно, тем не менее программная ошибка в данном примере оказывается такой же, как и в предыдущем. Если переменная $result содержит нулевое значение, ее содержимое определяется как логическое значение false, и поэтому результат выражения $result == false вычисляется как логическое значение true. И следующий далее кодовый блок будет выполняться, как будто никакой ошибки не произошло.

В качестве выхода из этого положения рекомендуется пользоваться оператором = (с тремя знаками равенства) языка РНР для проверки на точность совпадения. Это означает, что оба сравниваемых элемента должны быть одного и того же типа (логического, целочисленного, строкового и т.д.), а также должны иметь одинаковое значение. Следовательно, результат выражения $result === false вычисляется как логическое значение true только в том случае, если переменная $ result содержит логическое значение false. Применительно к рассматриваемому здесь примеру программная ошибка устраняется, даже если переменная $result содержит нулевое значение. В этом случае результат выражения $result === false вычисляется как логическое значение false.

Операторы === и !== осуществляют проверку на точность совпадения сравниваемых элементов по типу и значению, и поэтому ими удобно пользоваться при возврате из методов нулевых целочисленных значений, а также пустых (" ") и нулевых ("О") строковых значений в качестве достоверных результатов.
Если после выполнения запроса базы данных возвращается достоверный результат (в переменной $result), выполняется кодовый блок условного оператора if. Первая часть этого блока приведена ниже.

$parts = explode(':', $result->password);
$crypt = $parts[0];
$salt = @$parts[l];
$testcrypt = JUserHelper: :getCryptedPassword ($credentials [ 'password' ] ,
>$salt) ;

Пароль хранится в двух полях базы данных Joomla, разделяемых двоеточием. В первой строке приведенного выше фрагмента кода используется функция explode () языка РНР для размещения двух частей столбца таблицы с паролем в массиве $parts. Затем первая часть пароля сохраняется в переменной $crypt, а вторая его часть — в переменной $salt.

По умолчанию для шифрования паролей в Joomla применяется алгоритм одностороннего хеширования под названием md5. Под термином "одностороннее" подразумевается только шифрование пароля, но не его дешифрирование. Поэтому для проверки правильности введенного пароля значение, введенное пользователем, шифруется и сохраняется в переменной $testcrypt.

Далее следует очередной кодовый блок условных операторов if/then/else, в котором проверяется, совпадает ли зашифрованное значение введенного пароля с зашифрованным значением, хранящимся в базе данных. Этот кодовый блок приведен ниже.

if ($crypt == $testcrypt) {
// привести в соответствие с остальной системой $user = JUser::getlnstance($result- >id);
$response->email = $user->email;
$response->fullname = $user->name; if (JFactory::getApplication()->isAdmin()) {
$response->language = $user->getParam('admin_language');
}
else {
$response->language = $user->getParam('language');
}
$response->status = JAUTHENTICATE_STATUS_SUCCESS;
$response->error_message = ' ';
} else {
$response->status = JAUTHENTICATE_STATUS_FAILURE;
$response->error_message = JText:('JGLOBAL_AUTH_INVALID_PASS');
}

В первой части приведенного выше фрагмента кода проверяется правильность введенного пароля. Для этого получается объект пользователя, и в полях email и fullname объекта $response устанавливаются значения из соответствующих полей объекта пользователя. Затем получается объект подходящего языка в зависимости от конкретной части веб-сайта (пользовательской или административной). И наконец, в поле status объекта $response устанавливается состояние успешной регистрации. Если же сравниваемые пароли не совпадают, то в поле status устанавливается состояние неудачной регистрации, а в поле error_message — соответствующее сообщение об ошибке.

Обратите внимание на то, что команда возврата не выдается при успешной регистрации. Вместо этого в рассматриваемом здесь методе применяется специальный прием для восстановления связи с вызывающим методом. Этот прием состоит в том, что переменная $ response изменяется в данном методе, чтобы раскрыть значения полей из объекта достоверного пользователя.

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

// выйти из цикла, если аутентификация прошла успешно if ($response->status === JAUTHENTICATE_STATUS_SUCCESS)
{
if (empty($response->type)) {
$response->type = isset($plugin->_name) ? $plugin->_name : $plugin->name;
}
if (empty($response->username)) {
$response->username = $credentials['username1];
}
if (empty($response->fullname)) {
$response->fullname = $credentials['username'];
}
if (empty($response->password)) {
$response->password = $credentials['password'];
}
}
}
return $response;

Этот видоизмененный вариант объекта $ response доступен в рассматриваемом здесь методе и фактически возвращается им. И хотя метод authenticate () подключаемого модуля не возвращает сам объект $response, он передает обратно вызывающему методу результаты своего выполнения через обновленный объект $response.


Понравился материал? Пригодилась информация? Плюсани в социалки!


 
Похожие новости