php中類型轉(zhuǎn)換有自動(dòng)和強(qiáng)制兩種方式,常見(jiàn)規(guī)則包括字符串轉(zhuǎn)數(shù)字取開(kāi)頭數(shù)值,布爾值true為1、false為0,NULL轉(zhuǎn)整數(shù)為0、字符串為空。一、自動(dòng)類型轉(zhuǎn)換由php自行判斷,如字符串加數(shù)字時(shí)自動(dòng)轉(zhuǎn)為數(shù)值;二、強(qiáng)制轉(zhuǎn)換可用(int)$var或intval($var)等方式,settype()可修改原變量類型;三、注意事項(xiàng)有字符串含非數(shù)字導(dǎo)致轉(zhuǎn)換不全、浮點(diǎn)轉(zhuǎn)整被截?cái)唷⒉紶栔颠\(yùn)算偏差等,掌握這些規(guī)則有助于避免錯(cuò)誤。
在 PHP 中,數(shù)據(jù)轉(zhuǎn)換(也就是類型轉(zhuǎn)換)是很常見(jiàn)的操作。PHP 是一種弱類型語(yǔ)言,變量的類型會(huì)根據(jù)上下文自動(dòng)變化,但有時(shí)候我們還是需要手動(dòng)進(jìn)行類型轉(zhuǎn)換來(lái)確保程序邏輯正確。
一、PHP 類型轉(zhuǎn)換的基本方式
PHP 支持兩種類型的轉(zhuǎn)換方式:自動(dòng)類型轉(zhuǎn)換和強(qiáng)制類型轉(zhuǎn)換。
- 自動(dòng)類型轉(zhuǎn)換是 PHP 自己判斷變量類型并進(jìn)行處理。例如,把一個(gè)字符串賦值給一個(gè)變量后,再加一個(gè)數(shù)字,PHP 會(huì)嘗試把它轉(zhuǎn)成數(shù)字后再計(jì)算。
- 強(qiáng)制類型轉(zhuǎn)換則是開(kāi)發(fā)者顯式地指定目標(biāo)類型,比如 (int)$var 或者 intval($var)。
這兩種方式在開(kāi)發(fā)中都很常見(jiàn),理解它們有助于避免一些看似“奇怪”的結(jié)果。
立即學(xué)習(xí)“PHP免費(fèi)學(xué)習(xí)筆記(深入)”;
二、常見(jiàn)類型之間的轉(zhuǎn)換規(guī)則
PHP 中最常用的類型包括:整型(int)、浮點(diǎn)型(Float)、字符串(String)、布爾型(bool)、數(shù)組(Array)、對(duì)象(Object)和 null。
以下是一些常見(jiàn)類型之間轉(zhuǎn)換時(shí)的行為:
-
字符串轉(zhuǎn)整數(shù)或浮點(diǎn)數(shù):
- 如果字符串以數(shù)字開(kāi)頭,就取前面的數(shù)值部分,比如 “123abc” 轉(zhuǎn)成 123;
- 如果不是以數(shù)字開(kāi)頭,結(jié)果就是 0(int)或 0.0(float);
-
布爾值轉(zhuǎn)其他類型:
- true 轉(zhuǎn)成整數(shù)是 1,false 是 0;
- 在字符串拼接中,true 會(huì)變成 “1”,而 false 會(huì)變成空字符串;
-
null 轉(zhuǎn)換:
- null 轉(zhuǎn)成整數(shù)是 0;
- 轉(zhuǎn)成字符串是空字符串 “”;
- 轉(zhuǎn)成布爾值是 false;
這些規(guī)則雖然簡(jiǎn)單,但在實(shí)際開(kāi)發(fā)中如果不注意,很容易出現(xiàn)意想不到的結(jié)果。
三、強(qiáng)制類型轉(zhuǎn)換的方法
在代碼中,你可以使用以下幾種方式進(jìn)行強(qiáng)制類型轉(zhuǎn)換:
- 使用括號(hào)語(yǔ)法:(int) $var、(string) $val;
- 使用函數(shù):如 intval()、floatval()、strval();
- 使用 settype() 函數(shù)修改變量本身的類型。
這幾種方法的區(qū)別在于:
- 括號(hào)方式不會(huì)改變?cè)甲兞浚欠祷匾粋€(gè)新的轉(zhuǎn)換后的值;
- settype() 則是直接修改原變量的類型;
- 函數(shù)方式更適用于處理表達(dá)式或中間結(jié)果。
舉個(gè)例子:
$var = "123abc"; $num = (int)$var; // 得到 123
而如果寫成:
$var = "123abc"; settype($var, 'int'); // $var 現(xiàn)在變成了 123
兩者效果類似,但適用場(chǎng)景不同。
四、注意事項(xiàng)與容易出錯(cuò)的地方
雖然 PHP 的自動(dòng)類型轉(zhuǎn)換很靈活,但也有一些坑需要注意:
- 字符串中包含非數(shù)字字符時(shí),轉(zhuǎn)換可能不完全;
- 布爾值參與運(yùn)算時(shí),可能會(huì)導(dǎo)致結(jié)果偏差;
- 浮點(diǎn)數(shù)轉(zhuǎn)整數(shù)時(shí)會(huì)被截?cái)喽皇撬纳嵛迦耄?/li>
- 數(shù)組和對(duì)象不能隨意轉(zhuǎn)換,否則會(huì)報(bào)錯(cuò)或者得到不可預(yù)期的值;
比如下面這個(gè)例子:
echo (int) true; // 輸出 1 echo (int) false; // 輸出 0
如果你用布爾值做數(shù)學(xué)運(yùn)算,就要小心這種隱式轉(zhuǎn)換。
基本上就這些。掌握好這些規(guī)則,可以在開(kāi)發(fā)過(guò)程中少踩不少坑。