php流程控制語句以及條件判斷中的數據類型轉換
php的流程控制語句包括循環體語句和分支判斷語句。
循環操作包括三組語句,分別是while、do-while、for循環。
分支判斷體包括兩組:if else語句、switch語句。
以下以幾個題目來理解php流程控制語句以及條件判斷中的數據類型轉換。
***********************************************
題目一、if-else語句與條件判斷涉及的數據類型轉換
***********************************************
<?php /*習題*/ /*1。寫出下列代碼的運行結果*/ if(5<4) echo "true"; else echo "false-1"."<br />"; if("0") echo "true"; else echo "false-2"."<br />"; if($i) echo "true"; else echo "false-3"."<br />"; if("false") echo "true"; else echo "false-4"."<br />"; if(false) echo "true"; else echo "false-5"."<br />"; if(0.0) echo "true"; else echo "false-6"."<br />"; if(php) echo "true"; else echo "false-7"."<br />"; if("") echo "true"; else echo "false-8"."<br />"; if(null) echo "true"; else echo "false-9"."<br />"; if(array(12)) echo "true"; else echo "false-10"."<br />"; if(array()) echo "true"; else echo "false-11"."<br />"; /* 輸出結果: false-1 false-2 false-3 true false-5 false-6 true false-8 false-9 true false-11 分析:if語句當條件不滿足(即條件表達式計算結果為false)都會返回假。php的if語句沒有then,有elseif(同else if) 當轉換為boolean時候,以下值被認為是false: 1)布爾值false; 2)整型值0(零); 3)浮點型值0.0(零); 4)空白字符串和字符串“0”; 5)沒有成員變量的數組; 6)沒有單元的對象(僅適用於PHP4); 7)特殊類型NULL(包括尚未設定的變量); */ ?>
***********************************************
題目二、switch-case-default語句與break語句的關系
***********************************************
<?php /*2。寫出下列代碼的運行結果*/ $a = "linux"; switch($a){ //echo "hello"; case 'lamp': echo "one"; break; case php: echo "five"; break; case 'linux'://用不用引號均可 echo "six"."<br />"; case 6: echo "??"; case '8': echo "|||"; case 10: echo "10"."<br />"; break;//如果去掉此break將輸出default分支的@@ default: echo "@@"; break; } /* 運行結果為: six ??|||10 分析:請注意以上switch-case-default語句中,有的地方是沒有break語句的。 ①default在所有case開關中,總是最後執行。 ②一旦switch的條件判斷進入了一個開關(包括default),如果這個開關裡面沒有break跳出語句,則這個開關之後的語句被當做普通程序語句來執行,直到遇到break為止(比如:如果條件滿足了case 2開關,而case 2開關裡面沒有break語句,則case 2之後的語句被當做普通程序語句執行,case判斷不再有效。)。而如果進入的這個開關裡面有break語句,則執行完之後就跳出switch。 ③當前一語句的case語句為空時候,控制器自動轉移到下一case語句。 由此可見,使用switch的時候,如果case裡面沒有break,這個程序是相當危險的,這其中潛伏著的漏洞即使經驗豐富的測試人員也可能很難發現。 參考w3school的解釋: 工作原理: 1、對表達式(通常是變量)進行一次計算 2、把表達式的值與結構中 case 的值進行比較 3、如果存在匹配,則執行與 case 關聯的代碼 4、代碼執行後,break 語句阻止代碼跳入下一個 case 中繼續執行 5、如果沒有 case 為真,則使用 default 語句 */ ?>
***********************************************
題目三、switch-case-default語句和數據類型自動轉換的問題
***********************************************
<?php /*3。寫出下列代碼的運行結果*/ $a = "abc"; switch ($a) { case 0: echo "a 為 0"; break; case "cdef": echo "a 為 cdef"; break; case "abc": echo "a 為 abc"; break; default: echo "a 什麼都不是"; break; } /*輸出結果:a 為 0 分析: 這個問題應該從PHP作為動態腳本語言說起: 動態語言的變量類型是隨存儲的變量而變化的,即變量類型是根據具體環境而進行變化的。 字符串"abc",從表面來看可能指確切字符串,但是對於PHP存儲的時候它是不能確定的,因為隨著語義的變化,其所起的作用也會變化 第一個case 0:,PHP腳本將常量0解釋為確切的整數,與字符串比較大小時,需要將字符串轉換為整數。PHP腳本解釋器會自動將字符串abc,從十進制(默認)轉換為數字,但是abc很明顯不能代表十進制數,即轉換失敗,此時PHP將結果置為0,如果將字符串表示為"0xabc",那麼PHP腳本能夠發現0x標識,將abc作為十六進制轉換,所以能夠得到abc標識的十六進制整數。 如果學過C語言,可以做一個簡單比較: C中的case必須是數字常量,而不能是字符串,就因為C是變量類型確定的,運行時不能將確定的變量按語義隨意轉換。而PHP可以,因為PHP語言是動態的,變量類型是動態的。 或者從PHP的例子中學習: 如果一個文件將111111字符串(不是數字)存儲到文件,然後從文件直接讀取到變量$a,如下語法就可以將$a作為整數計算:0+$a 上述表達式得到的結果也可以作為動態語言的一個變現來看 */ ?>
***********************************************
題目四、編程中的疏忽易錯點——比較運算符和賦值運算符的差異
***********************************************
<?php /*4。寫出下列代碼的運行結果*/ if($i = ""){ echo "a"; } else { echo "b"; } /* 輸出結果:b 這裡的條件表達式不是比較運算符==,而是賦值運算符=,顯然,空字符串和字符串0都為false。 */ ?>
通過以上四個例子,我們在php基礎語法的前提下,更好的理解php語言在使用中的規則,尤其是php流程控制語句以及條件判斷中的數據類型轉換。這些知識的掌握有利於養成良好的代碼編寫習慣,規避一些現實中的陷阱,提高開發效率。
*