Согласованность возвращаемого типа в php5

Я видел множество тем о том, что возвращать в случае сбоя функции PHP. Но все они были о PHP 4.

Теперь в моем последнем (PHP 5) проекте я хочу обеспечить некоторую согласованность с типами возвращаемых значений (я даже не знаю, стоит ли это того в будущем). Итак, если нормальный возвращаемый тип метода — массив, что я должен вернуть в случае сбоя метода?

  • нулевой
  • пустой массив()
  • вместо этого сгенерировать исключение

В C# я бы вернул null, поэтому должен ли я писать PHP, постоянно думая, что бы я сделал на строго типизированном языке? Или что-то имеет больше смысла в этом конкретном сценарии? Каковы плюсы и минусы каждого из вариантов?


person Andy    schedule 17.01.2012    source источник


Ответы (4)


Я бы выдал исключение из-за неисправимой ошибки.

Например, предположим, что у вас есть такой метод, как getById($id). Можно вернуть null, если ничего не найдено. Теперь предположим, что у вас есть другой метод, delete($id), который сам вызовет getById($id). В этом случае, если ничего не найдено (т. е. getById вернул null), должно быть выдано исключение.

Помните, что всякий раз, когда вы сообщаете об ошибке с возвращаемым значением, являющимся нулем, пустым массивом или строкой или даже целым числом, вам нужно будет обработать эту ошибку, возможно, выполняя некоторую очистку где-то еще в зависимости от возвращаемого значения. Это может привести к некоторой грязи во всех задействованных методах/функциях.

Использование исключений позволит вам обрабатывать и перехватывать эти ошибки только в одном месте (в улове). Таким образом, вам не нужно копировать код, проверяющий наличие ошибки (был ли возвращен пустой массив? Было ли возвращаемое значение 1, 2 или 9? и т. д.). Кроме того, использование исключений позволяет легко «каталогизировать» тип ошибки (например, исключение бизнес-логики или недопустимые аргументы) без написания большого количества «если» в источнике.

Таким образом, если функция/метод что-то возвращает (т. е. завершилась нормально), возвращаемое значение — это то, что вы можете использовать (пустой массив, нуль или пустая строка — все это допустимые возвращаемые значения). Если функция/метод выдает исключение, явно что-то пошло не так.

Еще одна важная вещь заключается в том, что null может быть равен false, 0 и пустой строке, если вы не используете строгую проверку (=== против ==), так что это может привести к другим видам ошибок. Здесь исключения также могут быть преимуществом.

И, конечно же, что бы вы ни решили, важно, чтобы ваш выбор соответствовал коду.

person marcelog    schedule 17.01.2012

Если бы не было ошибки в выполнении логики вашего метода (в этом случае я бы предложил генерировать исключение), я бы сказал, верните пустой массив. Было бы легче справиться с такой ситуацией:

foreach($obj->method() as $item)
{
    // ...
}

Если бы YourClass::method() вернул null, я бы получил предупреждение «Недопустимый аргумент предоставлен», тогда как возврат пустого массива никогда не вызовет этого.

Что бы вы ни выбрали, придерживайтесь этого. Никому не нравится работать с API, возвращаемые значения которого противоречивы и не имеют логического смысла.

person Tim Cooper    schedule 17.01.2012

Если функция действительно «не работает», я бы сделал исключение. Исключения предназначены для обозначения сбоя.

Тем не менее, в какой-то момент вам нужно решить, что делать с исключением, и тогда вполне может случиться так, что вы решите, что возврат пустого массива может быть лучшим. Например, это было бы полезно, если вы хотите, чтобы ваши существующие циклы foreach() работали.

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

person Willem Mulder    schedule 17.01.2012

Если метод не работает, он должен быть классифицирован как исключение IMO, это позволит вам правильно уловить ожидаемые ожидания и действовать в соответствии с ними.

Я твердо верю в нормализацию ответов от функций и методов. Это делает жизнь намного проще, когда вы знаете, что вернет функция.

Короче говоря, если он терпит неудачу и исключение, если он не гарантирует возврат массива, мой $ 0,02

person Jason Brumwell    schedule 17.01.2012