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流程控制語句以及條件判斷中的數據類型轉換。這些知識的掌握有利於養成良好的代碼編寫習慣,規避一些現實中的陷阱,提高開發效率。
*