php要小心的坑

蜻蜓隊長dragonfly429發表於2019-03-20

php要小心的坑主要有

  • 弱型別
  • 浮點不精確
  • 引用的理解

弱型別

php90%的坑都在弱型別,1是弱型別相關的轉換規則,你得記住,2最麻煩的,在非常廣泛的範圍,都能進行型別按需轉換,是你得識別出可能自動轉換的地方,防止出bug,得時刻提防

主要有這麼幾點要掌握

  • 什麼時候轉換?在程式需要的時候,會自動轉換,這個就很難搞, 要時刻提防
  • 轉換成什麼型別?if('11' == 1.0)比如這個鬆散比較背後的轉換規則 ,你知道是吧str轉換成float還是把float轉換成str?這個需要知道
  • 轉換規則,知道從哪轉到哪後,我們還要知道 資料 從型別A轉換成型別B 產生的結果
  • 另外就是php手冊總結的,幾個函式isset empty is_null的處理結果,和鬆散比較表

按需轉換概念

在函式的引數 或者運算需要某個型別的變數時,如果給的不是,那就會自動轉換,要是不能轉,那就,報錯

鬆散比較轉換規則

看我總結的圖

php要小心的坑

記住三條解決12個情況

  • 凡是有一放是bool 就轉換為bool
  • 凡是有null,跟bool一樣,只是要==false
  • 凡是遇到array(str int float)全部false

剩下3個

  • int+float 按float比
  • str遇到int和float都轉換成對方型別,轉換規則是,如果是合法數值型別,就直接轉數值,開頭有數字就開頭的數字,開頭字母那就是0

互相轉換規則

看我總結的圖

php要小心的坑

用的比較多的情況是 其他往str和bool轉,這倆尤其要搞清楚

手冊附錄

php要小心的坑
php要小心的坑

PHP 型別比較表

怎麼樣達標

  1. 手冊那幾個表 背下來
  2. 轉換規則,背下來
  3. 鬆散比較自動轉換方向 背下來
  4. 能夠準確識別和警惕會自動轉換的地方

浮點不精確

這個相對簡單,就是你要知道浮點計算會出問題,然後大概原因是什麼?怎麼解決?

浮點不精確

上程式碼

<?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浮點數的一個常見問題的解答

怎麼破

  1. 先轉換為int在計算
  2. 用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中,物件都是引用傳值,

相關文章