【PHP】13. 三元運算子與單行條件判斷
【PHP】13. 三元運算子與單行條件判斷
此文章也有影片介紹,可以搭配影片一起學習!
01. 三元運算子與單行條件判斷 (所屬課程)
三元運算子與if-else的關係
三元運算子那這個東西聽起來很玄,但其實用法和if else沒甚麼差別,他可以讓你的程式碼看起來比較精簡(重複的程式碼打久了總想要精簡一點..),但是如果是初學者話還是建議先將if-else的基礎打好後再嘗試使用這種方式。
讓我們來回顧一下之前所學的if-else寫法,
$result = true;
if( $result ){
echo "真<br/>";
} else {
echo "假<br/>";
}
?>
輸出結果:
把括號拿掉後也能正常執行。
$result = true;
if(result)
echo "真<br/>";
else
echo "假<br/>";
?>
輸出結果:
這樣寫的好處是可以減少寫一些程式碼,特別在有好幾個if..else if...else的時候,
$result = 1;
if($result == 1)echo "1<br/>";
else if($result == 2) echo "2<br/>";
else if($result == 3) echo "3<br/>";
else if($result == 4) echo "4<br/>";
else echo "5<br/>";
?>
輸出結果:
不過這樣子的寫法其實不太流行,因為我們在下一個章節是switch case,switch case的可讀性更好,所以更常被使用。
而且這樣子寫有一個壞處,當echo “1<br/>”;只有一行的話,程式還能正常被執行,
範例:
$result = 1;
if($result == 1)
echo "1<br/>";
else if($result == 2) echo "2<br/>";
else if($result == 3) echo "3<br/>";
else if($result == 4) echo "4<br/>";
else echo "5<br/>";
?>
輸出結果:
但如果有很多行的時候,程式就死掉了。
$result = 1;
if($result == 1)
echo "1<br/>";
echo "1<br/>";
echo "1<br/>";
echo "1<br/>";
else if($result == 2) echo "2<br/>";
else if($result == 3) echo "3<br/>";
else if($result == 4) echo "4<br/>";
else echo "5<br/>";
?>
輸出結果:
除非加上大括號,
$result = 1;
if ($result == 1) {
echo "1<br/>";
echo "1<br/>";
echo "1<br/>";
echo "1<br/>";
echo "1<br/>";
}else if($result == 2) echo "2<br/>";
else if($result == 3) echo "3<br/>";
else if($result == 4) echo "4<br/>";
else echo "5<br/>";
?>
輸出結果:
1
1
1
1
因此我們從上述範例可以理解多行的時候必須加上大括號才能正確執行,
如果遇到這樣的情況建議使用下堂課的switch case語法。
三元運算子的寫法
如果有一個變數$result=true,我們想知道$result==true這件事是否為真並回傳相對應的值,我們只要用兩個符號 「?」 「:」連接就可以達成。
我們可以把 $result == true這件事存成一個變數 $str,
$result = true;
$str = ( $result == true) ? "真<br/>" : "假<br/>";
echo $str;
?>
輸出結果:
或者不使用變數$str,直接寫成一句話,
$result = true;
echo ($result == true) ? "真<br/>" : "假<br/>" ;
?>
輸出結果:
還有一個情況常常會用到三元運算子,如果有一個值是空值,我們還是必須提供它一個值,以免程式無法正確被執行,我們可以這樣寫,
$result;
$result = ( ($result == null) ? "" : $result);
echo $result . "<br />";
?>
輸出結果:
輸出結果是空值。
如果$result是null的時候也給它值,
$result;
$result = ( ($result == null) ? "這是Null,你確定要這個值?" : $result );
echo $result . "<br />";
?>
輸出結果:
這樣$result是null時也會顯示提示文字囉!
以上就是三元運算子的介紹,一起來練習看看吧!
課堂額外補充:
真實案例中,我們常常會解析別人提供給我們的資料,例如你利用API去跟別的網站服務要求未來的天氣氣溫情報等你不可能自己製作的資料(在家查溫度計再用過去資料研判嗎?一人中央氣象局?)。但是你不能假定他永遠是100%正確的,比方說他的機器突然當機,或是他改版出現Bug,或是他改格式但沒義務通知你,導致你收到的資訊可能完全或是部分不正確。
所以我們在寫法上面常常會用前一篇提到的內容。
$weather_state = null;
if ($weather_state == null){
$weather_state = "資料尚未抵達";
}
?>
但是資料通常是有的,所以我們其實可以用三元運算子寫成一個比較複雜的第二種寫法,當然這個寫法是暫時的,第三種寫法會更精簡。
$weather_state = null; // 真實情況$weather_state會是被其他方式賦予值。
$result = ($weather_state == null) ? "資料尚未抵達" : $weather_state
$weather_state = $result;
?>
其實$result根本不需要,所以第三種寫法是連再一起
// 真實情況$weather_state會是被其他方式賦予值。
$weather_state = null;
$weather_state = ($weather_state == null) ? "資料尚未抵達" : $weather_state;
?>
再來就是真正的目標寫法
因為判斷null的情況太常見了,所以PHP有個語法糖可以寫的更短(語法糖 = 特別設計出來寫得比較好看的寫法)。可以改寫成第四種寫法。
// 真實情況$weather_state會是被其他方式賦予值。
$weather_state = null;
$weather_state = $weather_state ?: "資料尚未抵達";
?>
上面的例子通常不會只判斷一項,所以程式碼會看起來這樣。
$county_name = $county_name ?: "國家名稱資料尚未抵達";
$city_name = $city_name ?: "城市名稱資料尚未抵達";
$weather_state = $weather_state ?: "天氣資料尚未抵達";
?>
如果再搭配後面課程提到的Class概念,就會更像真實專案的程式了。
最後,如果你喜歡我們的文章,別忘了到我們的FB粉絲團按讚喔!!