PHP編程中有哪些常見的低級錯誤?


  • isset

$a = null;
var_dump(isset($a)); //false

  • 精度損失問題(非bug)

$f = 0.57;
echo intval($f * 100); //56

  • empty

$a = "0";

if(empty($a)){
echo empty; //為空
} else {
echo not empty;
}

  • 三目運算符

$a = 1;
echo isset($a) ? 1 : isset($b) ? 2 : 3; //2

  • BOM頭問題

通常會導致json錯誤,還會導致導致Message: Cannot modify header information...

  • 引用賦值後未銷毀遍歷

$arr = array(1, 2, 3);
foreach ( $arr as $value ) {
$value = $value * 2 ;
}

foreach($arr as $value) {
echo $value; //2 4 4
}

  • strpos() ,請使用===來檢查此類函數的返回值

$mystring = abc ;
$findme = a ;
$pos = strpos ( $mystring , $findme );

if ( $pos === false ) {

} else {

}

  • php標籤問題,在純PHP文件中,不要帶關閉標籤?&>

如果PHP文件帶了關閉標籤?&>,不小心帶了換行或空格,你只能等哭了。

  • 空字元串被分割後,並不為空

print_r(explode(,, )); //[]

  • count()函數

var_dump(
count([]), //0
count(NULL), //0
count(aaa), //1
count(), //1
count(false) //1
);

查了半天bug,是不是經常寫出這樣:

if ($var = value) ...

那就寫成這樣吧:

if (value = $var) /* 直接報錯,這是為什麼很多人把常量放左邊啦 */

數字和字元串比較問題

var_dump(
0 == "a", // true
in_array("abc", array(0, 1)) //true
);

trim系列函數問題(非bug,讀手冊),請不要用它來剔除後綴名

var_dump(rtrim(abcppp.jpg, .jpg)); //abc

實際上都是自己的坑。。。未完,待補充(支持請點贊)...


都怪我打字太快。。。

$result = $this-&>select();
return $reus<

原來用sublime的時候經常這麼寫,我打字好快打字好快打字好快

現在用phpStorm就沒這個問題=。=


  1. 明文存取用戶密碼

  2. 硬編碼並版本控制後台系統的口令
  3. 不加密cookie
  4. "SELECT * FROM users where id={$_GET[uid]}"
  5. 自己DDOS自己 foreach ($uids as $uid) { $service = ..connect...; $service ... }
  6. if (條件滿足 ) { ... } 沒else,兩個月後發現神秘bug
  7. if流,if () { if () { if () { ... } } if () {} },不反向判斷簡化代碼
  8. 在一個view里算半天邏輯輸出一小段html
  9. 為傳參方便設計Class
  10. 把SESSION當NOSQL資料庫用, $_SESSION["post"][title] = ....
  11. $data流,$data = .. if (..) $data, $data, $data ... 一路$data
  12. 把Class當名字空間來用,method就是套了Class的function
  13. 這樣 $a-&>b[c][d][e] ... 還不用isset
  14. 把base64當加密演算法
  15. throw exception但懶得catch,以至於錯誤信息出現在http響應里讓用戶去catch


我來,我來這個問題親身經歷

曾經給客戶上一個模板的時候,這個模板的錯誤讓我無言以對

貼代碼

& & &

";
if ( $sourceurl != "-1" $sourceurl != "" $sourceurl != "0" strstr( $sourceurl, "/" ) )
{
$SourceArr = explode( "/", $sourceurl );
$sourcename = $SourceArr[1];
$sourcefolder = $SourceArr[0];
echo " &";
echo $strPlusZone4;
echo "& &
&& & ";
echo "&
$(document).ready(function(){
$().getPicSource();
});
&
";
}
echo " &
&

然後效果是這樣的

卧槽尼瑪==這簡直是智商餘額不足啊啊啊,

多寫一個

&

會死人啊

寫這個模板的程序猿你給窩出來,窩保證放學不打死你(逃

PS:其實低級錯誤很常見,但是請務必懷著一顆謙卑的心去面對所有你自己犯過或者別人犯過的錯誤,因為某一天,這一些經歷會成為你程序猿道路上最寶貴的財富


重複造輪子。比如PHP有提供函數來實現某個功能的,但是因為自己不知道,所以自己又寫了一個函數出來實現相同的功能,不但浪費時間而且增加了代碼的複雜度。


涉及金錢時,使用浮點數進行計算,然後每月結算時會發現會有幾塊錢的偏差,但對賬時卻發現不了問題。

其實應該使用Integer來處理的。

更新,原來可以用bcmath庫來專門解決這個問題,推薦https://packagist.org/packages/webit/bcmath


redis無密碼訪問

5.6 curl上傳文件


沒加分號


推薦閱讀:

TAG:Web開發 | PHP | 編程 | PHP學習 | 低級錯誤 |