這近更新 PHP到7.3版以後,出現這樣的錯:
Warning: "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"? in /path/to/x.php on line 123
程式碼類似:
while ($foo) { switch ($bar) { case "baz": continue; // Warning: "continue" targeting switch is equivalent to // "break". Did you mean to use "continue 2"? } do(); }
原本的邏輯是當 $bar== 'baz' 的情況時,就跳過switch後面的部分,也就是第8行的do()不會被執行到,重跑while的判斷。
到了php 7.3版以後,就出錯了,出錯原因在於7.3版以後,認真的把switch視為迴圈看待,事實上switch本來就屬於迴圈,而不是一個函數。
這也能說明為什麼case裡面會有"break"的存在。
如果迴圈裡有一個continue的話,代表就是重跑下一筆判斷,但是在switch裡重跑判斷就會無窮迴圈,所以在switch裡continue=break;
continue 2?
因此改寫成continue 2,這裡的2代表父迴圈:繼續父迴圈,自己是1省略不寫,父迴圈是2,祖父迴圈是3、曾祖父迴圈是4以此類推…
以下範例
for($ii=0;$ii<5;$ii++){ for($jj=0;$jj<10;$jj++){ switch($jj){ case 1: print "ii: $ii, jj: $jj\n"; continue 3; } } }
第4行採用 continue 3,所以會直接跳到 第1行的祖父迴圈
執行結果:
ii: 0, jj: 1
ii: 1, jj: 1
ii: 2, jj: 1
ii: 3, jj: 1
ii: 4, jj: 1
ii: 1, jj: 1
ii: 2, jj: 1
ii: 3, jj: 1
ii: 4, jj: 1
參考資料
[1] https://www.php.net/manual/en/migration73.incompatible.php
[2] https://www.php.net/manual/en/control-structures.continue.php