하나의 문자를 포함하는 문자열 인 "0"은 직관적으로 비어있는 것이 아닙니다. 다른 프로그래밍 언어와 달리 PHP가 부울로 변환 될 때 왜 FALSE로 취급합니까?
'0'
로 취급 0
에 $x + 1
, 왜 그것도으로 취급되어서는 안된다 0
, 따라서 false
,에 if ( $x )
?
하나의 문자를 포함하는 문자열 인 "0"은 직관적으로 비어있는 것이 아닙니다. 다른 프로그래밍 언어와 달리 PHP가 부울로 변환 될 때 왜 FALSE로 취급합니까?
'0'
로 취급 0
에 $x + 1
, 왜 그것도으로 취급되어서는 안된다 0
, 따라서 false
,에 if ( $x )
?
답변:
PHP는 문자열 요청 (URL 매개 변수 또는 브라우저의 양식의 POST 요청)을 자주 처리하는 웹 요청에 사용하도록 설계되었습니다. 따라서 문자열을 자동으로 다른 유형으로 캐스트합니다.
이것의 간단한 예는 것입니다 '1' + '2'
제공 3
하지 오류, 또는 '12
', 또는 다른 해석. 같은 논리로 문자열 '0'
을 numeric으로 사용할 수 있습니다 0
.
한편, 많은 언어와 마찬가지로 PHP는 부울로 캐스트 할 때 특정 값을 "거짓"으로 취급합니다. 말 그대로 직관적으로 "빈"값입니다. 여기에는 0
빈 문자열 ''
과 빈 배열 뿐만 아니라 숫자도 포함 됩니다 []
. 에서 if
문, 표현은 명시 적으로, 부울로 캐스팅 된 경우 if ( 0 )
와 동일합니다 if ( false )
.
이 두 가지를 합치면 수수께끼가 나옵니다. 한편으로 '0'
는 빈 문자열이 아닙니다. 다른 한편으로, 우리는 그것이 0
"빈" 숫자로 사용될 수 있다고 말했다 . PHP는 "제로 성"을 "스트링 성"보다 더 중요하게 취급하므로 '0'
"거짓"으로 간주됩니다.
한마디로 : '0' == 0 == false
; 또는(bool)'0' === (bool)(int)'0'
"0"
거짓"행동 을 갖는 Perl에서 가져 왔다고 생각 합니다. Perl에는 문자 그대로 문자열 "0"
과 숫자 사이에 사용자가 눈에 띄는 차이가 없습니다. 0
JSON을 처리 할 때는 짜증나지만 텍스트 데이터를 처리 할 때는 매우 직관적입니다. 그런 다음 0
문자열도 거짓없이 숫자 를 거짓으로 만드는 것은 불가능합니다 "0"
. PHP와 자바 스크립트는이 디자인 결정을 빌려,하지만 여전히 암시 적 변환을 허용하면서 문자열 / bools / 숫자 유형을 구분하여 약간의 혼동을 추가 (PHP : 0 == "0 foo"
, 0 == false
하지만 "0 foo" == true
: ==
는 이행되지 않음)
eq
문자열 평등 과 같은 추가 연산자를 사용하여 피연산자를 특정 유형으로 강제하는 내장 함수 를 제공합니다. 그러나 이것은 손실 된 캐스트의 비 "0 foo"
변이성에서 그것을 구하지 못합니다 : 부울 컨텍스트에서는 진실이지만 0
아래와 같습니다 ==
. 그래서 if ( ! $foo ) ..
와 $false = (1 == 2); if ( $foo == $false ) ...
동일한 결과를 제공하지 않습니다. 언어에 이것을 일관성있게 처리 할 수있는 "부울 동등성"연산자가없는 것 같습니다 ...
$_POST['id'] == 0
하여 사용자 입력을 숫자로 취급하려는 의도를 분명히합니다.
$false
설정됩니다 0
. $foo == $false
따라서을 쓸 때 Perl은 부울 비교를 원한다는 것을 모르고 대신 int로 캐스트합니다. 때문에 PHP에서, 즉, 발생하지 않습니다 $false
부울 거짓이다, 그래서 ==
캐스트는 논리 값으로 같은 결과를 제공!
booleans 의 PHP 문서에 따르면 다음과 같이 말합니다.
논리 값으로 변환 할 때, 다음과 같은 값으로 간주됩니다
FALSE
...
빈 문자열과 문자열 "0"
...
그렇지 않으면:
다른 모든 값은 TRUE (모든 리소스 포함)로 간주됩니다.
당신이 실행하는 경우 :
var_dump((bool) "0");
인쇄됩니다 :
부울 (false)
따라서 예상대로 작동합니다.
질문에 명시 적으로 대답하려면 :
그러나 연산자, 함수 또는 제어 구조에 부울 인수가 필요한 경우 값이 자동으로 변환되므로 대부분의 경우 캐스트가 필요하지 않습니다.
이것은 PHP의 "autocast"가 "0"을 정수 0으로 캐스트한다는 것을 의미합니다. 이것은 명령문 FALSE
과 같은 제어 구조에 if()
있습니다.