Я из C и C ++, но также играю с некоторыми вещами в Интернете. Все мы, C-люди (надеюсь), знаем, что вызов feof
для FILE*
перед чтением является ошибкой. Это то, что очень часто вызывает у новичков С и С ++. Это также относится и к реализации PHP?
Я полагаю, что это должно быть потому, что файл может быть сокетом или чем-то еще, где невозможно узнать размер до окончания чтения. Но почти каждый пример PHP (даже те, которые встречаются на php.net , которые я видел, выглядят примерно так (и тревоги у меня в голове):
$f = fopen("whatever.txt", "rb");
while(!feof($f)) {
echo fgets($f);
}
fclose($f);
Я знаю, что лучше написать это так и избежать этой проблемы:
$f = fopen("whatever.txt", "rb");
while($line = fgets($f)) {
echo $line;
}
fclose($f);
но это не главное. Я пытался протестировать, если что-то не получится, если я сделаю это «неправильным образом», но не смог заставить его вызвать неправильное поведение. Это не совсем научно, но я решил, что стоит попробовать.
Итак, неправильно ли вызывать feof
перед fread
в PHP?
Есть несколько способов, которыми PHP мог бы сделать это иначе, чем версия C, но я чувствую, что у них есть недостатки.
они могут иметь значение по умолчанию! EOF. Это неоптимально, потому что это может быть неправильно для некоторых угловых случаев.
они могли бы получить размер файла во время вызова fopen
, но это не могло работать на всех типах файловых ресурсов, приводя к несогласованному поведению, и было бы медленнее.