2013-04-09 3 views
2

첫째, 여기서 1과 0을 다루고 있으며 1 == true와 0 == false라는 것을 잘 알고 있습니다. 그러나 나는이 작동하지 않는 이유에 대해 궁금 :

$var = 1; 
echo $var; /* 1 */ 
$var = $var === 0; 
echo $var; /* Nothing */ 

echo $var;의 두 번째 인스턴스 (false)를 0을 반환하고 대신 아무 것도 반환하지 않은 이유가 있습니까?

마찬가지로 !$var도 아무 것도 반환하지 않습니다. 이 문제의 원인은 무엇입니까?

+0

@DipeshParmar 물론 데이터 유형이 일치하지 않는 경우에도 false를 반환하는 더 많은 이유가 있습니다. 그러나 참조를 위해서'=='와 같은 일이 일어납니다. –

+4

문자열로 전송 했으므로? –

+0

@ZombieHunter * "부울 FALSE는" "(빈 문자열)로 변환됩니다.이것은 부울과 문자열 값 사이에서 앞뒤로 변환을 허용합니다. "* http://www.php.net/manual/en/language.types.string.php#language.types.string.casting 그들은 * – deceze

답변

2

:

$var = ($var === 0); // sets $var to the result of the comparison 

에서 올바른 우선 순위. 이제 $var1 일 때 ($var === 0)echo을 통해 출력 할 때 빈 문자열로 표시되는 false을 반환합니다.

당신이 볼 수있는 "0"을 명시 적으로 (int) 연산자를 사용하여 정수로 false 값을 캐스트 :

echo (int)$var;  // ouputs "0" 
PHP 변수는 일반적으로 어떤 유형이 없기 때문에

false 값은 빈 문자열로 PHP로 표현됩니다 . 부울, int 또는 문자열은 없습니다 (Zend Engine에서 ZVAL이라고 함).

PHP 코드에서 ZVAL은 사용하는 위치에 따라 가장 일치하는 유형으로 자동 변환됩니다. 이를 type jugglingDocs이라고합니다.

PHP는 웹 사이트를 생성하기위한 것이기 때문에 빈 변수 (false == 0 == "") are represented with an empty string in the outputDocs이 생성됩니다.

+0

아, 알다시피, 나는 PHP가 빈 문자열로 처리 된 것을 인식하지 못했습니다. 흥미 롭 군! –

+0

@James "false'를 빈 문자열"로 처리하지 "않습니다. 부울에서 문자열로 변환 할 때 * false *를 빈 문자열로 변환합니다. 큰 차이. – deceze

+1

이 답변을 더욱 정확하게 업데이트했습니다. – Kaii

1

var_dump ($ var); 그 작은 너깃의 끝에 $ var = false가 표시됩니다.

왜냐하면 $ var === 0; 거짓이다; 유형이 표시 될 때

+0

$ var false 값을 표시하지 않는 이유는 무엇입니까? –

5

그것은, var_dump() 대신 echo에 무슨 일이 일어나고 있는지 보여 쉽게 : $var === 0 false로 평가하고, 그 값이 $var에 할당되고 있기 때문에

$var = 1; 
var_dump($var); /* int(1) */ 
$var = $var === 0; 
var_dump($var); /* bool(false) */ 

$var 말은 거짓 .

아무 것도 빈 문자열 최종 echo 부울 거짓들을 평가로 출력되고 있지 : 참조 http://www.php.net/manual/en/language.types.string.php

$var = $var === 0; 

과 같이 읽을 수 있기 때문이다

+0

false는 아무 것도 반환하지 않습니다. 그러나 이것이 그의 질문 이었으면 "왜 echo false가 반환됩니까? 아무것도 아니지? " – bwoebi

+0

@ 카이 페어 포인트, 업데이트 대답 –

0

$var = $var === 0;$var === 0 (false)의 결과를 $var에 할당합니다. echo false은 출력을 생성하지 않습니다.

0

===을 사용하면 데이터 형식도 일치합니다. 이 경우 1 === TRUE은 TRUE가 아닙니다.세 번째 줄에

$var = 1; 
echo $var; /* 1 */ 
$var = $var === 0; 
echo $var; /* Nothing */ 

, $var === 0 당신이 부울 문자를 인쇄 할 수 없습니다

$var = FALSE; 

을 넣어처럼 그것의, FALSE로 평가 때문에. 그러나 var_dump($var); 인 경우 부울 거짓임을 알 수 있습니다.

1

주요 부분이있다 :

echo $var; 

echo 구조체 수신 및 문자열을 생성한다. 변수가 부울이면 적절한 conversion이 적용됩니다.

부울 TRUE 값은 문자열 "1"로 변환됩니다. 부울 거짓은 을 ""(빈 문자열)으로 변환합니다. 이렇게하면 부울 값과 문자열 값 사이에 앞뒤로 변환 할 수 있습니다.

echo 당신이 사용하는 도구가 정보를 추출하는 방법을 알고하지 않는 문자열로 모든 것을 평평하게하는 중요한 정보의 손실을 초래할 수 있음을 주어 좋은 디버깅 도구가 아닙니다 이유 (그리고 echo하지 않습니다) . 이를 위해서는 var_dump()을 선택하는 것이 좋습니다.

2

당신은이 문제를 파악하기 위해 2 가지를 알아야합니다

당신은 ====보다 낮은 우선 순위, $var = $var === 0;$var = ($var === 0);이되고, 따라서 표현을 가지고 있음을 알 수 있습니다 -이 상황에서 $var(bool)false

를 포함합니다. echo 이후

  • 문자열에 $var 문자열로 변환됩니다 작동합니다. 부울 값 false은 문자열로 변환 될 때 빈 문자열입니다 (따라서 NULL이됩니다).