PHP가 null이거나 비어 있습니까?


208

NULLPHP 에 관한 질문이 있습니다 .

  $a = '';
  if($a == NULL) {
      echo 'is null';
  }

빈 문자열 일 때 왜 null이 표시 $a됩니까? 그게 버그 야?

답변:


348

당신이 찾고있는 것은 :

if($variable === NULL) {...}

를 참고하십시오 ===.
을 사용하면 ==PHP는 NULL , false , 0 , 문자열 및 배열을 동일하게 취급합니다.


13
False, 조건은 초기화되지 않은 및 null 과만 일치 $variable합니다. 당신이 원하는 것은 실제로 : $variable == null(참고 ==)
Thomas LAURENT

6
@ThomasLAURENT, 그것이 OP가 찾고있는 것입니다. 왜 == null빈 문자열과 일치 하는지, 왜 null 또는 undefined가 아닌지 궁금했습니다 .
Godwin

3
내 실수이지만, 마지막 문장으로 인해 NULL, false, 0 및 ""가 엄격하게 같고 잘못되었다고 오해했습니다.
Thomas LAURENT

3
@ 제임스 PHP의 의도 된 동작이며, 2017 년에도 여전히 유효하며 오랫동안 가정 할 것입니다.
Defrag

1
$a = ''빈입니다 string, false, 부울 것은 $a = 0;정수 및 null유형에서입니다 null. OP가 말하고있는 것은 PHP는 그것들을 "동일한"값으로 쓰지만 "동일한"타입으로 쓰지 않는다는 것입니다. 따라서 엄격한 === 검사는 유형을 확인하고 다른 유형을 사용하면 실패합니다. 그것이 당신이 당신의 반환 가치에 일치 해야하는 이유입니다. 와 같은 메소드에서 문자열을 getName()정상적으로 반환하면 null비어있을 때 얻을 수 없지만 빈 문자열 $user->getName() === '' 이나 $user->getId() === 0또는 가능성이 높습니다 $user->isActive === false. 의도 된 행동!
Cagatay Ulubay

225

다음 표에 도시 된 바와 같이, empty($foo)동등 $foo==nullis_null($foo)같은 기능을 갖는다 $foo===null. 이 표는 또한 null비교 와 관련된 까다로운 값을 보여줍니다 . (ϕ는 초기화되지 않은 변수를 나타냅니다.)

         empty    is_null 
         ==null  ===null  isset   array_key_exists
      ϕ |   T   |   T   |   F   |   F   
   null |   T   |   T   |   F   |   T   
     "" |   T   |   F   |   T   |   T   
     [] |   T   |   F   |   T   |   T
      0 |   T   |   F   |   T   |   T      
  false |   T   |   F   |   T   |   T   
   true |   F   |   F   |   T   |   T   
      1 |   F   |   F   |   T   |   T   
     \0 |   F   |   F   |   T   |   T   

나는 결코 사용 empty()하고 is_null()기능 하지 않습니다 . 간단한 비교를 사용하면 모호하고 빠르며 깨끗합니다. 특히 일치하는 중괄호가 줄어 듭니다.

예 : if($x==null || $y==null)vsif(is_null($x) || is_null($y))


2
테이블에 "0"및 "0.0"이 없습니다. 그것들은 정말로 까다 롭고 특히 empty ()를 만듭니다. 그래서 empty () 사용을 피합니다.
datasn.io 2016 년

1
@PHPst 당신이 보여준 테이블을 기반으로 했으므로 실제로 '간단한 비교'라는 PHP 코드는 무엇입니까?
Chetabahana

@hyip ==null===null.
PHPst

이것은 가장 완전한 대답이어야합니다. 감사.
pgr

@PHPst 당신은 간단한 비교가 덜 모호하다고 말했다. 이 NULL empty () 대신 간단한 비교를 사용하는 예제를 제공해 주시겠습니까?
Naeem Ul Wahhab

28

체크 ==vs===

'' == NULLtrue
0 == NULL를 반환합니다. true
false == null를 반환합니다. true 를 반환합니다.

어디서

'' === NULL거짓
0 === NULL을 반환합니다 거짓
false === NULL을 반환합니다


테스트 및 수정 ''== null (true) 동안 ''=== null (false)
TheLegendaryCopyCoder 2016 년

18

아니 버그가 아닙니다. 첫 번째 열의 각 값과 다른 열의 값을 비교 한 결과를 보여주는 == 테이블 (두 번째 테이블) 느슨한 비교를 살펴보십시오 .

    TRUE    FALSE   1       0       -1      "1"     "0"     "-1"    NULL    array() "php"   ""

    [...]    

""  FALSE   TRUE    FALSE   TRUE    FALSE   FALSE   FALSE   FALSE   TRUE    FALSE   FALSE   TRUE

당신은 빈 문자열이 있음이 볼 수 ""에 비해 false, 0, NULL또는 ""진정한 얻을 것입니다.

대신 is_null [docs] 를 사용 하거나 엄격한 비교 (세 번째 테이블) 를 사용할 수 있습니다 .


느슨한 비교표는 0 == "php"또는 "php"== 0을 비교하면 둘 다 참일 것입니다. 무슨 일이야?
Robert

1
@Robert : 숫자로 시작하지 않는 0문자열은 문자열로 캐스트 할 때 codepad.org/qi40SG3E 로 변환됩니다 . 그래서 (int)"php" == 0.
Felix Kling

@Robert : 나는 의미 "경우에 주조 " .
Felix Kling

12

없는 버그하지만 PHP 정상적인 동작. ==PHP 의 연산자가 유형을 확인하지 않기 때문에 발생 합니다.

'' == null == 0 == false

값의 유형이 같은지 확인하려면 ===대신 사용하십시오. 이 차이점에 대해 자세히 알아 보려면 공식 문서 를 읽으십시오 .


8

을 사용 ==하면 php는 빈 문자열이나 배열을로 취급합니다 null. 사이의 구별을하기 nullempty어느 사용 ===또는 is_null. 그래서:

if($a === NULL) 또는 if(is_null($a))


if ($ a === NULL)
Caster


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.