부울 컨텍스트에서 PHP가 "0"을 FALSE로 취급하는 이유는 무엇입니까?


12

하나의 문자를 포함하는 문자열 인 "0"은 직관적으로 비어있는 것이 아닙니다. 다른 프로그래밍 언어와 달리 PHP가 부울로 변환 될 때 왜 FALSE로 취급합니까?


2
:의 중복 stackoverflow.com/questions/523643/... . PHP와 자바 스크립트 모두 동일합니다. 아래 답변을 받아보십시오.
Walfrat

5
PHP는 가능한 한 많은 다른 프로그래밍 언어와 일관성을 갖기 위해 많은 노력을 기울이기 때문입니다.
David Arno

2
@DavidArno 반대로, 일관성을 유지 하기 위해 최선을 다하고 있습니다 . 문자열 자동 전송을 시작하면 (URL 또는 요청 본문에서 vars를 가져 오는 언어에서 매우 편리함) 해당 논리를 따라야합니다. 경우 '0'로 취급 0$x + 1, 왜 그것도으로 취급되어서는 안된다 0, 따라서 false,에 if ( $x )?
IMSoP

1
@DavidArno 정확히;)
linuxunil

1
@DavidArno 일단 잃어버린 캐스트를 시작하면 불일치가 불가피합니다. 일관된 솔루션은 일부 캐스트를 거부하고 나머지는 매우 신중하게 설계하는 것입니다. 그러나 처음부터 가장 많이 사용되는 언어는 거의 없습니다. 대부분 우연히 인기있는 실험에서, 또는 목적과 수하물이 다른 구식 언어에서 진화합니다. 이론적으로 많은 디자인을 갖춘 C #조차도 C에서 유래 한 일부 유산을 가지고 있으며, 이는 결코 보편적 인 것이 아닙니다. "일관된 길이로 일치하지 않는 것"과 같은 스내 크는 스포츠 경기에서 심판을 외치는 것과 같습니다.
IMSoP

답변:


12

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'


PHP를 감히 대담하고 값 싸고 무지한 농담 이외의 질문에 대답하기 위해 누군가 내 대답을 다운 투표 했습니까? 아니면 그들이 대답하고자하는 대답에 부정확하거나 도움이되지 않는 것이 있습니까?
IMSoP

1
필자는 PHP가 이것을 " "0" 거짓"행동 을 갖는 Perl에서 가져 왔다고 생각 합니다. Perl에는 문자 그대로 문자열 "0"과 숫자 사이에 사용자가 눈에 띄는 차이가 없습니다. 0JSON을 처리 할 때는 짜증나지만 텍스트 데이터를 처리 할 때는 매우 직관적입니다. 그런 다음 0문자열도 거짓없이 숫자 를 거짓으로 만드는 것은 불가능합니다 "0". PHP와 자바 스크립트는이 디자인 결정을 빌려,하지만 여전히 암시 적 변환을 허용하면서 문자열 / bools / 숫자 유형을 구분하여 약간의 혼동을 추가 (PHP : 0 == "0 foo", 0 == false하지만 "0 foo" == true: ==는 이행되지 않음)
아몬

@amon 네, Perl은 (거의) 모든 연산자에 대한 흥미로운 접근 방식을 사용하고 eq문자열 평등 과 같은 추가 연산자를 사용하여 피연산자를 특정 유형으로 강제하는 내장 함수 를 제공합니다. 그러나 이것은 손실 된 캐스트의 비 "0 foo"변이성에서 그것을 구하지 못합니다 : 부울 컨텍스트에서는 진실이지만 0아래와 같습니다 ==. 그래서 if ( ! $foo ) ..$false = (1 == 2); if ( $foo == $false ) ... 동일한 결과를 제공하지 않습니다. 언어에 이것을 일관성있게 처리 할 수있는 "부울 동등성"연산자가없는 것 같습니다 ...
IMSoP

숫자로 평가할 때 "0"은 0이지만 부울 컨텍스트 (예 : if 문)에서 문자열을 사용할 때는 숫자 값에 관심이 없습니다. 숫자로 해석하려면 예를 들어 숫자와 비교 $_POST['id'] == 0하여 사용자 입력을 숫자로 취급하려는 의도를 분명히합니다.
Michael Tsang

1
@MestreLion이 예제는 PHP가 아니라 Perl에 대한 것입니다. 중요한 차이점은 Perl에 별도의 부울 유형이 없으므로 다음과 같이 $false설정됩니다 0. $foo == $false따라서을 쓸 때 Perl은 부울 비교를 원한다는 것을 모르고 대신 int로 캐스트합니다. 때문에 PHP에서, 즉, 발생하지 않습니다 $false부울 거짓이다, 그래서 ==캐스트는 논리 값으로 같은 결과를 제공!
IMSoP

3

booleans 의 PHP 문서에 따르면 다음과 같이 말합니다.

논리 값으로 변환 할 때, 다음과 같은 값으로 간주됩니다 FALSE
...
빈 문자열과 문자열 "0"
...

그렇지 않으면:

다른 모든 값은 TRUE (모든 리소스 포함)로 간주됩니다.

당신이 실행하는 경우 :

var_dump((bool) "0");

인쇄됩니다 :

부울 (false)

따라서 예상대로 작동합니다.


질문에 명시 적으로 대답하려면 :

그러나 연산자, 함수 또는 제어 구조에 부울 인수가 필요한 경우 값이 자동으로 변환되므로 대부분의 경우 캐스트가 필요하지 않습니다.

이것은 PHP의 "autocast"가 "0"을 정수 0으로 캐스트한다는 것을 의미합니다. 이것은 명령문 FALSE과 같은 제어 구조에 if()있습니다.


명시 적 캐스팅이 아닌 부울로 변환 할 때 "0"을 FALSE로 처리하는 디자인 결정의 이론적 근거를 알고 싶습니다.
Michael Tsang
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.