2017-02-15 3 views
1

все. Сегодня я увидел пример цикла PHP while, который я не совсем понимаю.Нужна помощь в понимании образца PHP, а

Пример (Complete code)

// Open XML file 
$fp=fopen("note.xml","r"); 

// Read data 
while ($data=fread($fp,4096)) {   // Line about which I have questions 
    xml_parse($parser,$data,feof($fp)) or 
    die (sprintf("XML Error: %s at line %d", 
    xml_error_string(xml_get_error_code($parser)), 
    xml_get_current_line_number($parser))); 
} 

Выражение $data=fread($fp,4096) внутри скобок while цикла, кажется, не меняется. Это всего лишь одна инструкция присваивания. Как заканчивается этот цикл? Функция xml_parse($parser,$data,feof($fp)) может закончиться, когда синтаксический анализ завершен, но я не вижу, как это повлияет на условие теста для цикла while. Я чувствую, что синтаксический разбор XML-файла будет повторяться бесконечно.

Кроме того, когда есть выражение присваивания в качестве проверяемого условия для цикла, мы действительно просто хотим увидеть, если RIGHT стороны выходов назначения TRUE или FALSE, чтобы определить, следует ли закончить цикл? Я сомневаюсь в этом, потому что тогда он создавал бы бесконечный цикл для этого примера, поскольку $data, после назначения, всегда будет возвращать TRUE.

Благодаря

+0

Когда fread достигает конца файла, он возвращает значение null в $ data и становится false, так что while цикл остановится – SIDU

ответ

1

Она заканчивается, когда функция fread() возвращает ложь, которая делает, когда он достигает конца файла. Вы можете подтвердить это в документации PHP для FREAD:

http://php.net/fread

Что касается вашего вопроса о оценке выполнения задания, в PHP, когда вы оцениваете назначение он возвращает конечное значение переменной (отличное от Javascript, например, в котором присваивание действительно является тем, что оценивается), поэтому вы в основном и присваиваете значение переменной из функции и оцениваете результат этой функции (назначенной переменной) без какого-либо дополнительного синтаксиса.

+0

Так значит, что назначение происходит во время чтения файла, а не после завершения процесса чтения? –

+0

Да, fread() пытается считывать данные из файла, и если он может, возвращает его, если он не может, затем возвращает false, поэтому то, что заканчивается назначением переменной, - это либо данные, которые были прочитаны, либо ложный.Затем оператор 'while' оценивает окончательное значение вашей переменной' $ data', и как только он больше не может оценивать его как «истинный» (например, если значение равно false, null, ноль, пустая строка или пустой массив), он завершает работу. – ablopez

+0

Перечитайте свой оригинальный ответ и PHP: fread-Manual, я думаю, что сейчас понимаю. Спасибо –

0

Работа

while(there is data to read) OR (!EOF) 

break when reach (EOF==true) OR no data to read OR return false 

* EOF (end of file)

0

Как говорит PHP Manual, функция freadвозвращает строку для чтения или FALSE при неудаче.

Это означает, что:

$data=fread($fp,4096)

В приведенном выше заявлении значение $data является либо содержимое файла note.xml или false. Как вы знаете, цикл будет продолжаться до тех пор, пока не будет false. Этот оператор равен false только тогда, когда функция fread($fp,4096) не считывает данные из файла, когда нет данных для чтения.

+0

спасибо. Но я не могу понять, что вы сказали. Например, если $ data = fread ($ fp, 4096) является регулярным оператором вне цикла while. $ data были бы бесполезны, потому что в конечном итоге они всегда будут ЛОЖНЫ, так как всегда будет момент, когда нет данных, которые можно прочитать? –

+1

Да, именно поэтому этот трюк использовался внутри цикла, чтобы запустить цикл while до тех пор, пока эта точка не достигнет результата «FALSE» – Imran

+0

Upvote для указания этого. –

Смежные вопросы