Нет сомнений, что здесь происходит: файл не открывается успешно.Вот почему $handle
является bool
вместо ресурса (var_dump($handle)
, чтобы подтвердить это самостоятельно).
fgetcsv
затем возвращает null
(не false
!), Потому что есть ошибка,и ваш тест не подхватывает это, потому что вы тестируете с !== false
.Как указано в документации:
fgetcsv () возвращает NULL, если указан неверный дескриптор, или FALSE для других ошибок, включая конец файла.
Я согласен с возвращением null
и false
для различных состояний ошибки не идеальны, и, кроме того, это противоречит прецеденту, установленному множеством других функций, но это просто так (а вещи могут быть хуже ).При существующем положении вещей вы можете просто изменить тест на
while ($data = fgetcsv($handle, 1000, ","))
, и он будет работать правильно в обоих случаях.
Обновление:
Выявляются жертвами назначения внутри условия if
:
if ($handle = fopen($_SERVER['DOCUMENT_ROOT'].'/tmp/test-csv-file.csv', 'r') !== FALSE)
должно было быть
// wrap the assignment to $handle inside parens!
if (($handle = fopen($_SERVER['DOCUMENT_ROOT'].'/tmp/test-csv-file.csv', 'r')) !== FALSE)
Я уверен, что вы понимаете, что здесь пошло не так.Это причина, по которой я выбираю никогда, никогда не делать назначения внутри условных выражений .Мне все равно, что это возможно.Мне все равно, что это короче.Меня даже не волнует, что иногда написать «цикл», если задание снято, не так «элегантно».Если вы цените свое здравомыслие, подумайте о том же.