Всегда ли необходимо использовать "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().
Ответ 5
Что бы вы мне порекомендовали?
Да, это хорошая идея, и такие соображения делают вас защитным программистом:)
Ответ 6
Это лучше для меня:
foreach (is_array($arr) ? $arr : array() as $key=>$val) {
//..
}