Подтвердить что ты не робот

В php, должен ли я возвращать false, null или пустой массив в методе, который обычно возвращает массив?

Я нашел несколько ответов на это, но ни один из них не относится к PHP (который является крайне слабым типизированным языком):

Что касается PHP, целесообразно ли возвращать false, null или пустой массив в методе, который обычно возвращает массив, но имеет место сбой?

Другими словами, если другой разработчик подпрыгнул в моем проекте, что они ожидали увидеть?

4b9b3361

Ответ 1

Массив - это совокупность вещей. Пустой массив сигнализирует, что "все пошло нормально, в этой коллекции ничего нет". Если вы действительно хотите сигнализировать ошибку, вы должны вернуть false. Поскольку PHP динамически типизирован, легко проверить возвращаемое значение строго или свободно, в зависимости от того, что вам нужно:

$result = getCollection();

if (!$result)           // $result was false or empty, either way nothing useful
if ($result === false)  // an actual error occurred
if ($result)            // we have an array with content

В исключительных случаях есть исключения для отчетов об ошибках. Это зависит от обязанностей функции и степени серьезности ошибок. Если роль функции позволяет получить ответ "пустая коллекция" и "нет", это может быть хорошо. Однако, если функция по определению всегда должна возвращать коллекцию (даже если она пуста), и при определенных обстоятельствах она не может, бросание исключения может быть намного более подходящим, чем возвращение false.

Ответ 2

Я бы решительно отказался возвращать смешанные возвращаемые значения типа. Я считаю, что это такая проблема, что я написал небольшую статью о не возвращающей смешанные типизированные значения.

Чтобы ответить на ваш вопрос, верните пустой массив. Ниже вы можете найти небольшой пример, почему возвращение других значений может вызвать проблемы:

// This kind of mixed-typed return value (boolean or string),
// can lead to unreliable code!
function precariousCheckEmail($input)
{
  if (filter_var($input, FILTER_VALIDATE_EMAIL))
    return true;
  else
    return 'E-Mail address is invalid.';
}

// All this checks will wrongly accept the email as valid!
$result = precariousCheckEmail('nonsense');
if ($result == true)
  print('OK'); // -> OK will be given out

if ($result)
  print('OK'); // -> OK will be given out

if ($result === false)
  print($result);
else
  print('OK'); // -> OK will be given out

if ($result == false)
  print($result);
else
  print('OK'); // -> OK will be given out

Надеюсь, это поможет предотвратить некоторые недоразумения.

Ответ 3

Просто для себя я обычно предпочитаю возвращать пустой массив, потому что, если функция всегда возвращает массив, безопасно использовать его с функциями массива PHP и foreach (они будут принимать пустые массивы). Если вы вернете null или false, вам нужно будет проверить тип результата перед передачей его функции массива.

Если вам нужно различать случай, когда метод выполняется правильно, но не нашел никаких результатов, и случай, когда в методе произошла ошибка, тогда, когда в него входят исключения. В первом случае безопасно возвращать пустой массив. В последнем простое возвращение пустого массива недостаточно, чтобы уведомить вас о том, что произошла ошибка. Однако, если вы возвращаете нечто иное, чем массив, вам придется иметь дело с этим в вызывающем коде. Выброс исключения позволяет обрабатывать ошибки в другом месте в соответствующем обработчике ошибок и позволяет прикрепить сообщение и код к исключению, чтобы описать, почему произошел сбой.

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

method getThings () {
    $things = array ();
    if (get_things_we_are_interested_in ()) {
        $things [] = something_else ();
    } 
    if (!empty ($things)) {
        if (!process_things ($things)) {
            throw new RuntimeExcpetion ('Things went wrong when I tried to process your things for the things!');
        }
    }
    return $things;
}

Ответ 4

Это зависит от ситуации и от плохой ошибки, но хороший (и часто упускаемый) вариант заключается в throw exception:

<?php
function inverse($x) {
    if (!$x) {
        throw new Exception('Division by zero.');
    }
    else return 1/$x;
}

try {
    echo inverse(5) . "\n";
    echo inverse(0) . "\n";
} catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
}

Это гарантирует, что ваша функция не будет терпеть неудачу, и ошибки не исчезнут.

Ответ 5

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

В случае ошибки вы должны выбросить исключение. Это должно быть предпочтительным способом обработки ошибок.

Ответ 6

Какой бы вы ни предпочли, хотя я предлагаю пустой массив для этой причины. Вам не нужно сначала проверять тип!

<?php
function return_empty_array() {
    return array();
}

$array = return_empty_array();

// there are no values, thus code within doesn't get executed
foreach($array as $key => $value) {
    echo $key . ' => ' . $value . PHP_EOL;
}
?>

В любом другом случае, если вы вернете false или null, вы получите ошибку в цикле foreach.

Это небольшая разница, хотя, на мой взгляд, большая. Я не хочу проверять, какой тип значения я получил, я хочу считать его массивом. Если результатов нет, тогда это пустой массив.

В любом случае, насколько мне известно, нет никаких "умолчаний" для возврата пустых значений. Встроенные функции PHP меня поражают очень разными значениями, которые он возвращает. Иногда false, иногда null, иногда пустой объект.

Ответ 7

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