PHP 易錯知識點整理

1. 注意echo和print的區別

PHP中echo和print都是輸出的做用,可是二者之間仍是有細微的差異。echo輸出後沒有返回值,但print有返回值,當其執行失敗時返回flase。所以能夠做爲一個普通函數來使用,例如執行$r = print "Hello World"; 變量$r的值將爲1。並且代碼中echo語句的運行效率要略快於print語句。php

2. 注意空字符串('')和NULL的區別

PHP中空字符串和NULL都是以值爲0存儲的,可是他們的類型並不同,前者是string,然後者是NULL,可見字符串('')、NULL值相等但類型不等。數據庫

3. 分清==(等與)和===(全等與)的區別

二者都屬於比較運算符,==(等於)只比較值是否相等,而===(全等於)則不但比較值是否相等,還會比較類型是否相等,它更爲嚴格。編程

4. 分清include與require的區別

include()與require()的功能也基本相同,但在用法上也有一些不一樣,include()是有條件包含函數,而require()則是無條件包含函數。例如在下面代碼中,若是變量$a爲真,則將包含文件a.php:
if($a){
include("a.php");
}
而require()則和include()不一樣,無論$a取何值,下面的代碼都會把文件a.php包含:
if($a){
require("a.php");
}
在錯誤處理方面,使用include語句,若是發生包含錯誤,程序將跳過include語句,雖然會顯示錯誤信息可是程序仍是會繼續執行。可是,requre語句會提示一個致命錯誤。數組

5. 注意isset和 empty的區別

empty是判斷一個變量是否爲「空」,而isset則是判斷一個變量是否已經被設置。函數

6. 分清self :: 和 this--> 的區別

在訪問PHP類中的成員變量或方法時,若是被引用的變量或者方法被聲明成const(常量)或者static(靜態屬性),那麼就必須使用域操做符::,而若是被引用的變量或者方法沒有被聲明成const或者static,那麼就使用指向操做符->。ui

7. foreach循環後留下懸掛指針

  在foreach循環中,若是咱們須要更改迭代的元素或是爲了提升效率,運用引用是一個好辦法:this

$arr = array(1, 2, 3, 4); foreach ($arr as &$value) {     $value = $value * 2; } // $arr is now array(2, 4, 6, 8)
  這裏有個問題不少人會迷糊。循環結束後,$value並未銷燬,$value實際上是數組中最後一個元素的引用,這樣在後續對$value的使用中,若是不知道這一點,會引起一些莫名奇妙的錯誤:)看看下面這段代碼:編碼

$array = [1, 2, 3]; echo implode(',', $array), "\n";指針

foreach ($array as &$value) {} // by reference echo implode(',', $array), "\n";code

foreach ($array as $value) {} // by value (i.e., copy) echo implode(',', $array), "\n";
  上面代碼的運行結果以下:

1,2,3
1,2,3
1,2,2
  你猜對了嗎?爲何是這個結果呢?
  咱們來分析下。第一個循環事後,$value是數組中最後一個元素的引用。第二個循環開始:
第一步:複製$arr[0]到$value(注意此時$value是$arr[2]的引用),這時數組變成[1,2,1]
第二步:複製$arr[1]到$value,這時數組變成[1,2,2]
第三步:複製$arr[2]到$value,這時數組變成[1,2,2]
  綜上,最終結果就是1,2,2
  避免這種錯誤最好的辦法就是在循環後當即用unset函數銷燬變量:

$arr = array(1, 2, 3, 4); foreach ($arr as &$value) { $value = $value * 2; } unset($value); // $value no longer references $arr[3]

8.忽略Unicode/UTF-8問題

  php編程中,在處理非ascii字符時,會遇到一些問題,要很當心的去對待,要否則就會錯誤遍地。舉個簡單的例子,strlen($name),若是$name包含非ascii字符,那結果就有些出乎意料。在此給出一些建議,儘可能避免此類問題:若是你對unicode和utf-8不是很瞭解,那麼你至少應該瞭解一些基礎。推薦閱讀這篇文章。最好使用mb_*函數來處理字符串,避免使用老的字符串處理函數。這裏要確保PHP的「multibyte」擴展已開啓。數據庫和表最好使用unicode編碼。知道jason_code()函數會轉換非ascii字符,但serialize()函數不會。php代碼源文件最好使用不含bom的utf-8格式。  在此推薦一篇文章,更詳細的介紹了此類問題: UTF-8 Primer for PHP and MySQL   

相關文章
相關標籤/搜索