細節決定成敗,那麼在PHP中有哪些小細節是容易出錯的呢?一起來看看吧!希望對大家有所幫助,更多內容請關注應屆畢業生網!
注意echo和print的區別
PHP中echo和print都是輸出的作用,但是兩者之間還是有細微的差別。echo輸出後沒有返回值,但print有返回值,當其執行失敗時返回flase。因此可以作爲一個普通函數來使用,例如執行$r = print "Hello World"; 變量$r的值將爲1。而且代碼中echo語句的運行效率要略快於print語句。
注意空字符串('')和NULL的區別
PHP中空字符串和NULL都是以值爲0存儲的.,但是他們的類型並不一樣,前者是string,而後者是NULL,可見字符串('')、NULL值相等但類型不等。
分清==(等於)和===(全等於)的區別
兩者都屬於比較運算符,==(等於)只比較值是否相等,而===(全等於)則不但比較值是否相等,還會比較類型是否相等,它更爲嚴格。
分清include與require的區別
include()與require()的功能也基本相同,但在用法上也有一些不同,include()是有條件包含函數,而require()則是無條件包含函數。例如在下面代碼中,如果變量$a爲真,則將包含文件。而require()則和include()不同,不管$a取何值,下面的代碼都會把文件包含,比如:
在錯誤處理方面,使用include語句,如果發生包含錯誤,程序將跳過include語句,雖然會顯示錯誤信息但是程序還是會繼續執行。但是,require語句會提示一個致命錯誤。
注意isset和 empty的區別
empty是判斷一個變量是否爲“空”,而isset則是判斷一個變量是否已經被設置。
分清self :: 和 this--> 的區別
在訪問PHP類中的成員變量或方法時,如果被引用的變量或者方法被聲明成const(常量)或者static(靜態屬性),那麼就必須使用域操作符::,而如果被引用的變量或者方法沒有被聲明成const或者static,那麼就使用指向操作符->。
foreach循環後留下懸掛指針
這裏有個問題很多人會迷糊。循環結束後,$value並未銷燬,$value其實是數組中最後一個元素的引用,這樣在後續對$value的使用中,如果不知道這一點,會引發一些莫名奇妙的錯誤:)看看下面這段代碼:
上面代碼的運行結果如下:
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函數銷燬變量:
忽略Unicode/UTF-8問題
php編程中,在處理非ascii字符時,會遇到一些問題,要很小心的去對待,要不然就會錯誤遍地。舉個簡單的例子,strlen($name),如果$name包含非ascii字符,那結果就有些出乎意料。在此給出一些建議,儘量避免此類問題:
最好使用mb_*函數來處理字符串,避免使用老的字符串處理函數。這裏要確保PHP的“multibyte”擴展已開啓。
數據庫和表最好使用unicode編碼。
知道json_code()函數會轉換非ascii字符,但serialize()函數不會。
php代碼源文件最好使用不含bom的utf-8格式。