Всегда ли необходимо использовать "is_array()" перед началом foreach?

Мне было интересно, нужно ли всегда использовать что-то вроде is_array() перед каждым foreach, которое я делаю.

Если переменная не является массивом, она выдает ошибку. Поэтому я всегда использую:

if(is_array($users))   {
    foreach($users as $user){

    }
}

Что бы вы мне порекомендовали? Спасибо.

Ответы

Ответ 1

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

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

Кроме этого, использование этого оператора if - путь.

Ответ 2

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

Некоторые хаки, которые я видел, включают листинг переменной в массив: (array) $users. Это не рекомендуется, но лучше явно проверить тип.

Кроме того, если это код внутри функции, вы можете использовать ввод аргументов:

function mycode(array $users)
{
    foreach ($users as $user) { }
}

Когда функция вызывается с неправильным типом, она вызывает ошибку.

Ответ 3

Предполагая, что это происходит в функции:

function doSomethingWithUsers($users)
{
    if(!is_array($users))
    {
        throw new Exception('$users is expected to be an array');
    }

    foreach($users as $user){
        ...
    }
}

Таким образом, вы сразу увидите, когда он вызывает неправильные параметры.

Ответ 4

В общем, лучше не.

Хорошим общим принципом в программировании является не скрытие или игнорирование ошибок.

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

Однако здесь имеется ряд предположений:

  • Предполагается, что переменная должна быть массивом. Если вы используете foreach(), я предполагаю, что это так. Если вы используете foreach() для чего-то, что может быть законным, а не массивом, это может означать, что вашему коду может потребоваться повторная работа.

  • Отчеты об ошибках и/или протоколирование (отчетность на сервере разработки, запись в процессе производства) должны быть настроены правильно, чтобы извлечь выгоду из того, что вам скажут PHP-ошибки. В частности, почти никогда не стоит игнорировать предупреждения PHP - несмотря на то, что они называются "предупреждениями", они обычно указывают на отказ, который (по моему мнению) должен прекратить выполнение.

Тем не менее, не обязательно неправильно использовать is_array() перед foreach().

Ответ 6

Это лучше для меня:

foreach (is_array($arr) ? $arr : array() as $key=>$val) {
  //..
}