Статус возврата метода: bool, string, const… (PHP)

Этот вопрос: Лучший способ вернуть флаг состояния и сообщение из метода на Java похож на мой, однако я бы сделал это на PHP, а не на Java (который мог бы сделать здесь небольшая разница).

Проблема:

Там ' метод, который может иметь либо успешный результат (он может измениться на более успешный), либо «проблемный». Последнее означает, что операция не удалась, но также важно знать, почему. Представьте себе метод класса аутентификации:

public function login($name, $password)
{
    if (successful_authentication)
    {
        report success
    }
    else
    {
        report failure, explain why (e.g. wrong name/pass, user banned)
    }
}

Было бы тривиально вернуть истину и ложь в случае успеха или неудачи, но как сообщить о причине сбоя?

Возможные решения:

  • Вернуть истину или ложь и написать другое метод (getStatus ()), чтобы получить конкретную проблему: мне это кажется немного неудобным
  • Используйте исключения: поскольку не исключено, что пользователь будет забанен (исключение будет, если пользователь умрет, набирая как другой автор на этом сайте указано) использование исключений здесь в этих случаях было бы просто неправильным (однако метод может вызвать исключение базы данных, если запрос не выполняется)
  • Возвращает истину в случае успеха и строку в случае ошибки с кодом ошибки, указывающим проблема: с PHP можно получить хорошие чистые блоки следующим образом:

     $ loginStatus = $ auth-> login ('name', 'проходить');
    если ($ loginStatus === true)
    {
     сделай что-нибудь();
    }
    еще
    {
     если ($ loginStatus == 'неправильный_логин_данные')
     ...
     elseif ($ loginStatus == 'забанен')
     ...
     // или с массивом сообщений об ошибках:
     echo $ erroMessages [$ loginStatus];
    }
    
  • Возвращает объект общего статуса (состояния): очень элегантное решение, а также перспективное (нет проблем, если количество статусов меняется или позже должны быть возвращены дополнительные данные), возможно, лучший вариант:

     $ loginStatus = $ auth-> логин ('имя', 'пройти')
    если ($ loginStatus-> isSuccess)
    ...
    еще
    echo $ errorMessages [$ loginStatus-> errorCode]; // $ errorMessages как в предыдущем примере
    
  • Один из двух, но не с простой строкой, а с константами класса:

     $ loginStatus = $ auth-> login ('name', 'pass')
    если ($ loginStatus-> isSuccess)
    ...
    elseif ($ loginStatus-> errorCode == Auth :: ERR_USER_BANNED)
    ...
    

    При этом нет необходимости объяснять коды ошибок в документации, и это будет казаться более "естественным" (по крайней мере, для меня).

Вопрос:

Что бы вы использовали (из вышеперечисленного те или любое другое решение)? Что было доказано в долгосрочной перспективе как хороший способ?

Заранее спасибо!

6
задан Community 23 May 2017 в 12:31
поделиться