하나의 문자를 포함하는 문자열 인 "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"과 숫자 사이에 사용자가 눈에 띄는 차이가 없습니다. 0JSON을 처리 할 때는 짜증나지만 텍스트 데이터를 처리 할 때는 매우 직관적입니다. 그런 다음 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()있습니다.