php要小心的坑主要有
- 弱型別
- 浮點不精確
- 引用的理解
弱型別
php90%的坑都在弱型別,1是弱型別相關的轉換規則,你得記住,2最麻煩的,在非常廣泛的範圍,都能進行型別按需轉換,是你得識別出可能自動轉換的地方,防止出bug,得時刻提防
主要有這麼幾點要掌握
- 什麼時候轉換?在程式需要的時候,會自動轉換,這個就很難搞, 要時刻提防
- 轉換成什麼型別?
if('11' == 1.0)
比如這個鬆散比較背後的轉換規則 ,你知道是吧str轉換成float還是把float轉換成str?這個需要知道 - 轉換規則,知道從哪轉到哪後,我們還要知道 資料 從型別A轉換成型別B 產生的結果
- 另外就是php手冊總結的,幾個函式
isset empty is_null
的處理結果,和鬆散比較表
按需轉換概念
在函式的引數 或者運算需要某個型別的變數時,如果給的不是,那就會自動轉換,要是不能轉,那就,報錯
鬆散比較轉換規則
看我總結的圖
記住三條解決12個情況
- 凡是有一放是bool 就轉換為bool
- 凡是有null,跟bool一樣,只是要==false
- 凡是遇到array(str int float)全部false
剩下3個
- int+float 按float比
- str遇到int和float都轉換成對方型別,轉換規則是,如果是合法數值型別,就直接轉數值,開頭有數字就開頭的數字,開頭字母那就是0
互相轉換規則
看我總結的圖
用的比較多的情況是 其他往str和bool轉,這倆尤其要搞清楚
手冊附錄
怎麼樣達標
- 手冊那幾個表 背下來
- 轉換規則,背下來
- 鬆散比較自動轉換方向 背下來
- 能夠準確識別和警惕會自動轉換的地方
浮點不精確
這個相對簡單,就是你要知道浮點計算會出問題,然後大概原因是什麼?怎麼解決?
浮點不精確
上程式碼
<?php
echo floor((0.7+0.1)*10); //7
echo PHP_EOL;
echo intval(0.58*100); //57
echo PHP_EOL;
echo ((0.7+0.1)== 0.8)?'相等':'不相等';//不相等
echo PHP_EOL;
echo (1.23456789123456789==1.23456789123456780)?'相等':'不相等';//相等
echo PHP_EOL;
echo '---use bc-----';
echo (bcadd(0.7,0.1,1)== 0.8)?'相等':'不相等';//相等
複製程式碼
原因
因為數字在內部是二進位制 具體看這個 PHP浮點數的一個常見問題的解答
怎麼破
- 先轉換為int在計算
- 用bc函式
引用
先看這個 我晚點補齊 php中引用&的真正理解-變數引用、函式引用、物件引用
foreach &問題
先看一個經典的題目
<?php
$arr = [1,2,3];
foreach($arr as &$v){
echo $v.',';
}
echo PHP_EOL;
foreach($arr as $v){
echo $v.',';
}
複製程式碼
結果輸出
1,2,3,
1,2,2,
複製程式碼
為啥?這篇圖文並茂解答PHP foreach引用&
obj引用
php中,物件都是引用傳值,