2011-12-22 36 views
0
<?php 
/* PHP devs, test & tell me I'm crazy. */ 
$x[] = '1'; 
if (empty($x[0]['x'])) { 
    echo 'No PHP bug.'; 
} 
else { 
    echo 'PHP bug exists.'; 
} 
?> 

我總是得到「存在PHP錯誤」。這是一個PHP的錯誤?

<?php 
/* PHP devs, test & tell me I'm crazy. */ 
$x[] = 1; 
if (empty($x[0]['x'])) { 
    echo 'No PHP bug.'; 
} 
else { 
    echo 'PHP bug exists.'; 
} 
?> 

輸出「沒有PHP錯誤」。

<?php 
/* PHP devs, test & tell me I'm crazy. */ 
$x[] = '1'; 
if (!isset($x[0]['x'])) { 
    echo 'No PHP bug.'; 
} 
else { 
    echo 'PHP bug exists.'; 
} 
?> 

輸出「存在PHP錯誤」。

<?php 
/* PHP devs, test & tell me I'm crazy. */ 
$x[] = '1'; 
if (!isset($x[0]['hello world'])) { 
    echo 'No PHP bug.'; 
} 
else { 
    echo 'PHP bug exists.'; 
} 
?> 

輸出「存在PHP錯誤」。

+0

你正在將一個標量轉換爲一個數組可能與此有關 – RageZ

回答

8

這是因爲你正在給數組分配一個字符串。因此,的$x[0]['x']會自動轉換爲0 - 請記住,第二個indes不是指向數組,而是一個字符串,它不能包含非數字索引。

$x[0][0]確實存在 - 它是字符串的第一個字符。

$x[0][1]存在的,如果你改變相應的索引測試返回正確的結果:

if (isset($x[0][0])) echo "0 index is set."; 
if (isset($x[0][1])) echo "1 index is not set."; 

教訓:即使字符串可以像數組進行訪問,他們是不是數組。

有一個warning in the PHP manual page on strings解釋的行爲:

寫入超出範圍的偏移墊帶空格的字符串。非整數類型轉換爲整數。非法偏移類型會發出E_NOTICE。負偏移量在寫入時發出E_NOTICE,但讀取空字符串。只使用分配字符串的第一個字符。分配空字符串分配NULL字節。

+0

那麼你會認爲這裏的自動鑄造是一個PHP的錯誤? – mikeytown2

+1

@mikey不是真的。它按設計工作 - 這有點不直觀(我同意你最初預期的行爲會覺得更正確),但它的行爲如上所述 –

0

我認爲這與您可以按字符訪問字符串的方式有關。

$x[0]['x'] 

相當於

$x = '1'; 
$x['x']; 

因爲你正在訪問使用[]串,那就索引轉換爲在這種情況下的「x」的整數將轉換爲0,因此將提取第一個字符 '1'

這裏演示:

$x[] = '1'; 
var_dump($x[0]['x']); 
2

這不是一個錯誤。

$x[] = '1'; 

這使得像這樣的數組:array(1)。因爲$x[0] == '1'

當你做$x[0]['x'],你在做"1"['x']

'x'轉換爲0"1"[0] == "1",它不是空的。