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