Мне интересно получить отзывы об этой технике, которую я откуда-то взял.
Я использую это, когда функция может либо выполниться успешно, либо завершиться ошибкой, но вы хотели бы получить больше информации о том, почему она не удалась. Стандартным способом сделать то же самое была бы обработка исключений, но я часто нахожу это немного чрезмерным для такого рода вещей, плюс PHP4 не предлагает этого.
По сути, метод включает в себя возврат true в случае успеха и что- то, что соответствует false в случае неудачи. Вот пример, чтобы показать, что я имею в виду:
define ('DUPLICATE_USERNAME', false);
define ('DATABASE_ERROR', 0);
define ('INSUFFICIENT_DETAILS', 0.0);
define ('OK', true);
function createUser($username) {
// create the user and return the appropriate constant from the above
}
Прелесть этого в том, что в вашем вызывающем коде, если вам все равно, ПОЧЕМУ создание пользователя не удалось, вы можете написать простой и читаемый код:
if (createUser('fred')) {
// yay, it worked!
} else {
// aww, it didn't work.
}
Если вы особенно хотите проверить, почему это не сработало (для ведения журнала, отображения пользователю или чего-то еще), используйте сравнение идентификаторов с ===
$status = createUser('fred');
if ($status) {
// yay, it worked!
} else if ($status === DUPLICATE_USERNAME) {
// tell the user about it and get them to try again.
} else {
// aww, it didn't work. log it and show a generic error message? whatever.
}
На мой взгляд, преимущества этого заключаются в том, что это нормальное ожидание, что успешное выполнение такой функции вернет true, а неудача вернет false.
Недостатком является то, что вы можете иметь только 7 "error" return values: false, 0, 0.0, "0", null, "", and (object) null.
если вы забудете использовать проверку личности, вы можете неправильно выполнить свою программу. Кто-то еще сказал мне, что использование таких констант, как, enum
где все они приравниваются к false, является "ick"
.
Итак, переформулируем вопрос: насколько приемлема такая практика? Вы бы порекомендовали другой способ добиться того же результата?
Решение проблемы
Я согласен с другими, которые заявили, что это немного на стороне WTFy. Если это четко задокументированная функциональность, то это не проблема, но я думаю, что было бы безопаснее выбрать альтернативный путь возврата 0 для успеха и целых чисел для кодов ошибок. Если вам не нравится эта идея или идея глобальной переменной последней ошибки, рассмотрите возможность переопределения вашей функции как:
function createUser($username, &$error)
Затем вы можете использовать:
if (createUser('fred', $error)) {
echo 'success';
}
else {
echo $error;
}
Внутри createUser просто заполните $error любой ошибкой, с которой вы столкнулись, и она будет доступна за пределами области действия функции благодаря ссылке.
Комментариев нет:
Отправить комментарий