第16章 控制循環php
1.循環的種類node
循環用來指代任意一種迭代控制結構,任何一種可以致使應用程序反覆執行的一段代碼的結構。編程
循環的種類:數組
(1)計數循環:預先知道循環的次數。(例如常見的for循環)安全
(2)連續求值循環:預先不知道要執行多少次,它會在每次迭代時檢查是否應該繼續。(例如讀取文本,直到遇到結束符時結束循環)服務器
(3)無限循環:一旦啓動一直執行下去。編程語言
(4)迭代器循環:對容器類裏面的每一個元素都執行一次操做。spa
2.循環的選擇調試
(1)while循環code
若是預先不知道要循環多少次,那麼就使用while循環。
有關while循環的主要注意事項就是在循環開始仍是結束處檢測。
a)檢測位於循環的開始
b)檢測位於循環的結束 (do-while):該循環至少執行一次
(2)帶退出的循環
所謂帶退出的循環就是終止條件出如今循環中間而不是開始或者末尾的的循環。(在php中使用while和break來模擬)例如:
while(!endOfData()) { $data = readDate(); if(errorData($data)) //若是出現數據錯誤 { break; } process($data); }
注意:爲了便於調試和閱讀代碼,應當把全部的退出條件放在一塊兒,同時應該用註釋來闡明操做意圖。
(3)for循環
若是須要一個執行次數固定的循環,那麼就能夠選擇for循環。
注意:不要在for循環裏經過直接修改下標的方式迫使循環結束。例如:
for($i=0;$i<=10;$i++) { if(error()) { $i = 10; //修改下標使循環下次再也不執行 糟糕的實踐 } 。。。。 }
(4)foreach循環(編程語言支持的)
適合對容器內(數組或者其餘)的各項元素進行操做。
3.循環控制
1)進入循環
a)把初始化代碼緊放在循環前面。
b)用while(true)表示無限循環。
當須要一個無限循環時,(例如服務器監聽鏈接)不要採用for i=1 to 99999這樣的虛假無限循環,這樣會模糊循環的用意,應當使用while(true),或者for(;;)這樣的循環表示。
2)處理好循環體
a)用{ }把循環體中的語句括起來。
增長代碼的可讀性,防止修改代碼時出錯。
b)避免空循環。
空循環:把循環所處理的代碼和檢測循環是否終止的代碼寫在同一行裏。例如:
while( ($inputChar = data->read()) != CharType_Eof ) { ;//循環體內是一個分號,由於循環處理代碼已經在上一行作了 }
這是很差的習慣,應該分開完成各部分的內容:
do { $inputChar = data->read(); }while($inputChar != CharType_Eof);
c)把循環內務操做放在循環的開始或者末尾。
循環內務操做是指像i=i+1或者j++這樣的表達式,他們的主要目的不是完成循環工做,而是控制循環。
d)一個循環只作一件事。
3)退出循環
a)設法確認循環可以終止。
這是使用循環的基本要求。須要考慮正常的狀況‘、端點、以及每一種異常狀況。
b)使循環終止條件看起來很明顯。
c)不要爲了終止循環而胡亂改動for循環的下標。(前面提到過)
d)考慮使用安全計數器。
安全計數器能夠確保循環執行的次數。例如:
while(nodeNext()) { saftCounter++; if(saftCounter >= LIMIT) { //終止循環 } 。。。。。 }
4)提早退出循環
所謂提早退出循環是指除了知足循環終止條件之外的循環終止。
a)在某些狀況下,經過使用break來實現提早退出循環比使用布爾標記要好,使得程序更容易理解。
b)當心那些有不少break散步其中的循環。
一個循環中包括的break過多,有可能致使錯誤的退出。例如:
do { switch ....... if() { ...... break;//這個break在這裏原本是要退出if的,結果連循環一塊兒退出了。 } }while(......);
4.檢查端點
對於簡單循環來講,須要注意三種狀況:開始的狀況、任意選擇的中間狀況、最終的狀況,當心出現off-by-one的錯誤。
5.使用循環變量
(1)用整數或者枚舉類型表示數組和循環邊界。
(2)嵌套循環中使用有意義的變量名來提升可讀性。
(3)避免下標串話。(即在嵌套的循環中用相同的下標名錶示不一樣變量)
(4)把下表變量的做用域限制在循環之內。
這項準則能夠得到語言的內建機制的支持,例如在循環頭聲明下標變量:
for($index=0;$index<MAX;$index++) { ........ }
在for循環頭部聲明下標,則index變量的做用域不會超出for循環。