PHP 易錯知識點整理

2021-07-26 06:14:35 字數 1556 閱讀 2669

php中echo和print都是輸出的作用,但是兩者之間還是有細微的差別。echo輸出後沒有返回值,但print有返回值,當其執行失敗時返回flase。因此可以作為乙個普通函式來使用,例如執行$r = print "hello world"; 變數$r的值將為1。而且**中echo語句的執行效率要略快於print語句。

php中空字串和null都是以值為0儲存的,但是他們的型別並不一樣,前者是string,而後者是null,可見字串('')、null值相等但型別不等。

兩者都屬於比較運算子,==(等於)只比較值是否相等,而===(全等於)則不但比較值是否相等,還會比較型別是否相等,它更為嚴格。

include()與require()的功能也基本相同,但在用法上也有一些不同,include()是有條件包含函式,而require()則是無條件包含函式。例如在下面**中,如果變數$a為真,則將包含檔案a.php。而require()則和include()不同,不管$a取何值,下面的**都會把檔案a.php包含,比如:

在錯誤處理方面,使用include語句,如果發生包含錯誤,程式將跳過include語句,雖然會顯示錯誤資訊但是程式還是會繼續執行。但是,require語句會提示乙個致命錯誤。

empty是判斷乙個變數是否為「空」,而isset則是判斷乙個變數是否已經被設定。

在訪問php類中的成員變數或方法時,如果被引用的變數或者方法被宣告成const(常量)或者static(靜態屬性),那麼就必須使用域操作符::,而如果被引用的變數或者方法沒有被宣告成const或者static,那麼就使用指向操作符->。

這裡有個問題很多人會迷糊。迴圈結束後,$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函式銷毀變數:

php程式設計中,在處理非ascii字元時,會遇到一些問題,要很小心的去對待,要不然就會錯誤遍地。舉個簡單的例子,strlen($name),如果$name包含非ascii字元,那結果就有些出乎意料。在此給出一些建議,盡量避免此類問題:

JAVA 易錯點整理

public class的類名必須與檔名相同,乙個類檔案中可以有多個類,只有乙個public 各種迴圈的判別式的結果必須是bool型的,若出現 編譯失敗。浮點數等基本型別初始化為0,boolean初始化為false,string等物件的預設值是null,有length 這個方法,並且不能對new 出...

知識點整理

一 標準庫容器和演算法 1.順序容器 與前面類似 2.關聯容器 map和multimap 元素包含key 鍵 和值 value 兩部分 按照鍵對元素排序 map不允許重複元素出現,但multimap可以 set和multliset 是包含已排序物件的關聯容器 只是單純的鍵的集合 set不允許重複鍵出...

知識點整理

一 標準庫容器和演算法 1.順序容器 與前面類似 2.關聯容器 map和multimap 元素包含key 鍵 和值 value 兩部分 按照鍵對元素排序 map不允許重複元素出現,但multimap可以 set和multliset 是包含已排序物件的關聯容器 只是單純的鍵的集合 set不允許重複鍵出...