php中的坑,你掉進去過幾個?

  1. ‘abc' == 0 return truephp

    由於這是一個數字和一個字符串進行比較,PHP會把字符串轉換成數字再進行比較。PHP轉換的規則的是:若字符串以數字開頭,則取開頭數字做爲轉換結果,若無則輸出0。例如:123abc轉換後應該是123,而abc則爲0,0==0這固然是成立的.具體能夠參考官方手冊:若是比較一個整數和字符串,則字符串會被轉換爲整數數組

  2. null和空、0,三個值的比較函數

    在PHP中,== 會先進行類型轉換,再進行對比,而===會先比較類型,若是類型不一樣直接返回不相等,參考以下示例spa

    $a = null;
    $b = '';
    $c = 0;
    echo ($a == $b)?1:0;    // 輸出1
    echo ($a === $b)?1:0;   // 輸出0
    echo ($a == $c)?1:0;    // 輸出1
    echo ($a === $c)?1:0;   // 輸出0
    echo ($b == $c)?1:0;    // 輸出1
    echo ($b === $c)?1:0;   // 輸出0

3.foreach裏的引用賦值,參見官方文檔code

在官方文檔裏有一句警告:Warning 數組最後一個元素的 $value 引用在 foreach 循環以後仍會保留。建議使用 unset() 來將其銷燬。對象

咱們看一組代碼:文檔

$a = [1,2,3];
foreach($a as &$item){
    echo $item . ',';
}
//unset($item); // 引用賦值後不銷燬對象
foreach($a as $item){
    echo $item . ',';
}

上面的代碼的輸出以下:字符串

1,2,3,1,2,2 看最後一個輸出的是2,而不是3,就是由於代碼裏沒有銷燬$item形成的,緣由以下:it

第一個循環,把3的引用賦給了$item,第二個循環,把1賦給了$item,由於$item是引用,致使數組的元素3變成了1,明白了嗎?class

4. isset與empty的聯繫和區別

empty對以下8種狀況返回true:

null、 空串""、字符串0"0"、空array、布爾值false、數字0、浮點數0.0、類裏用var定義可是未賦值 www.stuhack.com

isset 檢測變量是否設置,而且不是 NULL,可是對於empty的8種狀況,只有null返回false,其它7種狀況都返回true

綜上所述,除了empty描述的的非null的7種狀況,在其它狀況下, if(empty(變量)) 等效於 if(!isset(變量))

5. strrchr函數

在W3School站點上的註釋以下:

strrchr() 函數查找字符串在另外一個字符串中最後一次出現的位置,並返回從該位置到字符串結尾的全部字符。

若是成失敗,不然返回 false。

實際上,這個函數是查找某個字符,而不是查找字符串,應該參考官方文檔

代碼示例:

$a = 'abcdef.txt';
$b = '.php';
echo strrchr($a, $b);

上面的代碼輸出是:.txt

也就是說,若是$b是字符串,只使用第一個字符,後面的其它字符會忽略

注:php提供了strstr函數,爲何不提供strrstr函數呢,雖然本身實現也很簡單

相關文章
相關標籤/搜索