2016-08-28 49 views
1

我想我知道關於PHP的一切,直到我碰到了這個返回true:PHP - isset非現有陣列關鍵

$foo = 'hello'; 
isset($foo['a']);  // returns false - OK 
isset($foo['a']['b']; // returns false - OK 
isset($foo['a'][0]); // returns true! WTF?! 

任何人可以解釋我的第4行的結果呢?使用php 5.5.36進行測試。

+0

'var_dump($ foo ['a'] [0])' –

+0

也在http://phpfiddle.org/上找到,代碼爲$ foo ='hello'; echo isset($ foo ['a'])? '是2':「」; //返回false - 確定 echo isset($ foo ['a'] ['b'])? '是3':「」; //返回false - 確定 echo isset($ foo ['a'] [0])? '是4':「」; ' –

+0

但是foo是字符串而不是數組 –

回答

5

嗯,這個問題有點令人誤解,因爲isset返回true對於任何非null變量。由於$foo是一個字符串,而不是數組,$foo["a"]給出了一個非法字符串偏移量警告。 PHP假設你打算把"a"作爲一個整數偏移量,並且這樣做會隱式地執行,將$foo["a"]轉換爲$foo[0],這會給出字符串"h"爲字符串的第一個偏移量)。由於返回值是另一個字符串,因此表達式變爲"h"[0],這又是"h"

換句話說,$foo["a"][0]其中$foo = "hello"是與$foo[0][0]相同的東西,它給我們"h"

但據不存在的數組鍵,isset肯定會返回false因爲一個不存在的關鍵線索,以不存在的值,它隱含null

+0

Legit。 https://3v4l.org/vehe6#v540 –