2011-12-22 2 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.'; 
} 
?> 

"No PHP bug."

<?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 bug exists."

<?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 bug exists."

+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있다 : 범위의 부족에 쓰기

는 패드를 공백 문자열을 오프셋. 정수가 아닌 유형은 정수로 변환됩니다. Illegal offset type은 E_NOTICE를 발생시킵니다. 음수 오프셋은 쓰기에서 E_NOTICE를 발생 시키지만 빈 문자열을 읽습니다. 지정된 문자열의 첫 번째 문자 만 사용됩니다. 빈 문자열을 할당하면 NULL 바이트가 할당됩니다.

+0

여기 자동 캐스팅을 PHP 버그로 생각하십니까? – mikeytown2

+1

@mikey 정말 아닙니다. 그것은 설계대로 작동합니다 - 조금은 직관력이 없습니다 (나는 원래 기대했던 행동이 더 옳다는 것에 동의하지만) –

0

이것은 문자로 문자열에 액세스 할 수있는 방법과 관련이 있다고 생각합니다.

$x[0]['x'] 

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

당신이 []을 사용하여 문자열에 접근하고 있기 때문에 동일합니다, 그것은 0으로 변환 할 'X'경우의 정수로 인덱스를 변환하는 것, 그래서 그것은을 추출 할 첫 번째 문자 '1'

여기 데모 :

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

이것은 버그가 아닙니다.

$x[] = '1'; 

이 배열과 같이한다 : array(1).

so $x[0] == '1'.

$x[0]['x']을 수행하면 "1"['x']입니다.

0으로, "1"[0] == "1"은 비어 있지 않습니다.

관련 문제