2017-02-15 84 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。 –