2017-02-15 85 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))); 
} 

while环路括号内的表达式$data=fread($fp,4096)似乎没有任何改动。这只是一个赋值语句。这个循环如何结束? 解析完成后,函数xml_parse($parser,$data,feof($fp))可能会结束,但我不明白它将如何影响while循环的测试条件。我觉得XML文件的解析会无限重复。

也时有赋值表达式作为一个循环的测试条件下,我们是否真的只是想看看是否转让收益TRUEFALSERIGHT侧,以确定是否结束循环?我对此持怀疑态度,因为这样会产生一个无限循环,因为$data一旦被分配,将总是返回TRUE

感谢

+0

当fread到达文件结尾时,它将返回null到$ data并且它变为false,因此while循环将停止 – SIDU

回答

1

它结束时,fread()函数返回false,当它到达文件末尾,其确实。当你评估一个赋值,将返回变量的最终值(不同

http://php.net/fread

至于你提到的分配的评价问题,在PHP中:您可以将PHP文件中确认本作的fread例如Javascript,其中的赋值确实是被评估的),所以你基本上都是从一个函数赋值给一个变量,然后在没有任何额外语法的情况下评估该函数的结果(赋给变量)。

+0

这意味着在读取文件时发生分配,而不是在读取过程完成后发生? –

+0

是的,fread()试图从文件中读取数据,如果可以的话,返回它,如果它不能,则返回false,所以分配给变量的结尾是要读取的数据,或者假。然后'while'语句计算你的'$ data'变量的最终值,一旦它不能再评估它为“真”(例如,如果该值为假,空,零,空字符串或空数组),它退出。 – 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手册说,功能fread返回读取字符串或FALSE的失败。

这意味着:

$data=fread($fp,4096)

在上述声明$data值可以是你的文件note.xmlfalse的内容。你可能知道,while循环会一直持续到条件为false。只有当fread($fp,4096)函数无法从文件中读取数据时(当没有数据要读取时),此语句为false

+0

谢谢。但我无法理解你所说的话。例如,如果$ data = fread($ fp,4096)是while循环之外的常规语句。 $数据将是无用的,因为它最终总是会是FALSE,因为当没有数据要读取时总会有一个时间点。 –

+1

是的,这就是为什么这个技巧在while循环内部用于运行while循环,直到结果为'FALSE'时达到该点为止' – Imran

+0

Upvote for out out。 –