is_null ($ var)과 ($ var === null)의 차이점은 무엇입니까?


83

이것 사이에 차이점이 있습니까?

if (is_null($var)) {
    do_something();
}

이?

if ($var === null) {
    do_something();
}

변수에 null이 있는지 여부를 확인할 때 어떤 형식이 더 낫습니까? 내가 알아야 할 엣지 케이스가 있습니까? (모든 변수를 초기화하므로 존재하지 않는 변수는 문제가되지 않습니다.)


5
===명시적인 기능이 아니기 때문에 연산자가 더 빠를 것이라고 생각할 것입니다 ...하지만 한두 번 놀랐습니다.
John Giotta 2011 년

답변:


30

변수가 초기화 된 경우 (이 상황에서 이것이 중요한지 100 % 확실하지는 않지만, 변수가 정의되지 않은 경우 두 솔루션 모두 경고를 표시 할 수 있음), 기능적으로 동일합니다. 나는 추정 ===빨리 함수 호출의 오버 헤드를 제거로 비록 소폭 될 것이다.

그것은 당신이 당신의 상태를 어떻게 보는지에 달려 있습니다.

===엄격한 데이터 비교를위한 것입니다. NULL에는 '값'이 하나만 있으므로 NULL (널 '값'의 PHP 상수)과 비교하는 데 사용할 수 있습니다.

is_null 변수가 NULL 데이터 유형인지 확인합니다.

당신이 선택하는 것은 당신에게 달려 있습니다.


2
값별 비교와 유형별 비교를 설명해 주셔서 감사합니다.
kijin

4
대신 is_null실수로 사용하기 쉽기 때문에 변형을 선호합니다 . 는 (다른 답변 참조) 과 동일 하기 때문에 간단하고 읽기 쉬운 . == null=== null== nullemptyis_null
ryanm

101

이다 true

이다 false

        | isset   | is_null | ===null | ==null  | empty   |
|-------|---------|---------|---------|---------|---------|
|  null |    ❌   |    ✅   |    ✅   |    ✅  |    ✅   |
|  true |    ✅   |    ❌   |    ❌   |    ❌  |    ❌   |
| false |    ✅   |    ❌   |    ❌   |    ✅  |    ✅   |
|     0 |    ✅   |    ❌   |    ❌   |    ✅  |    ✅   |
|     1 |    ✅   |    ❌   |    ❌   |    ❌  |    ❌   |
|    \0 |    ✅   |    ❌   |    ❌   |    ❌  |    ❌   |
| unset |    ❌   |    ✅   |    ✅   |    ✅  |    ✅   |
|   ""  |    ✅   |    ❌   |    ❌   |    ✅  |    ✅   |

요약 : 🔸 ♦ ️🔸

  • empty 다음과 같다 ==null
  • is_null 다음과 같다 ===null
  • isset의 역수 is_null===null

12
나는이 테이블을 정말로 좋아한다.
Cheok Yan Cheng

3
$v일부 일반 변수를 나타 내기 위해 이름이 지정된 첫 번째 열과 기타 isset($v), is_null($v)등 을 갖는 것이 테이블을 약간 더 명확하게 만들 수 있습니다 $v===null.
Brandin

@Brandin 제안 해 주셔서 감사합니다. 대답을 자유롭게 편집하십시오.
PHPst

4
@Pacerier 그것들이 동등하다고 분명히 말 했으므로 기능적 차이는 없습니다.
PHPst

1
isset정의되지 않은 변수에 대해 불평하지 않고 false를 반환합니다. 사용 is_null또는 === null통지가 발생합니다.
user1431317

17

둘 다 똑같 is_null습니다. 코드를 더 읽기 쉽게 만들기 때문에 사용 합니다.


3
===가 처음에는 더 빠를 수 있지만 PHP 옵티마이 저가이를 해결해야합니다.
foo

10
나는 is_null실제로 덜 명확 하다고 느낍니다 . 잘 읽을 수 있지만 $v === null비교가 엄격한 의미론으로 수행된다는 것은 의심의 여지가 없지만을 사용 is_null($v)하면 일부 코더는 그것이 사용 ===하는지 또는 ==의미론 인지 궁금해 할 것 입니다.
염소

4
@goat, ish1301, 또한 완전히 제거하거나 재정의is_null 할 수 있지만 항상 작동합니다. === null
Pacerier 2015 년

@Pacerier 귀하의 예제는 누군가가 runkit pecl 패키지를 설치 한 다음 내장 함수를 제거하고 is_null을 제거하도록 설정하여 무언가로 바꾸지 않고 모든 것을 제거하는 것은 nil에 매우 가깝거나 null 인 경우 당신이 선호합니다. 내가 생각할 수있는 유일한 시나리오는 사람이 is_null을 제거하려는 경우, 전역 적으로 null 비교의 동작을 변경하려는 경우입니다. 예를 들면 다음과 같습니다. 설정되지 않은 경우 true 대신 false를 반환합니다. 이 경우 코드가 is_null로 시작하여 작성된 경우에만 실제로 가능합니다.
kaan_a

7

php가 is_foo () 유형의 함수를 너무 많이 갖는 것이 중복 된 것 같으면 표준 비교 연산자를 사용할 수있을 때 프로그래밍 방식으로 호출되는 함수를 고려하십시오.

$arrayOfNullValues = array_filter($myArray, 'is_null');

$arrayWithoutNullValues가지고 배열 저장할 것이다 null 다음, 값.
PointedEars 2012

5

저는 각각 백만 번의 반복을 테스트하면서 빠른 벤치 마크를 실행했습니다. is_null완료하는 데 8 초가 걸렸습니다. === null1을 가져 갔다.

따라서 호출 is_null===내 컴퓨터 에서 호출하는 것보다 0.000007 초 더 느립니다 .

최적화하기에 더 유용한 것을 찾을 것입니다.


내 코드 :

<?php

$start = time();
$var = null;

for ($i = 1000000; $i--; ) {
    is_null($var);
}

echo time() - $start;

$start = time();

for ($i = 1000000; $i--; ) {
    $var === null;
}

echo time() - $start;

1
흥미롭게도 PHP / 7은이 문제를 해결 한 것으로 보이며 성능은 이제 거의 동일합니다. 사실, is_null()7.1.9 Win32에서 내 컴퓨터에서 약간 더 빠릅니다.
Álvaro González

@ ÁlvaroGonzález 나는 똑같은 것을 발견했습니다. 두 기능 간의 차이는 무시할 수 있습니다. (is_null : 0.54486592610677, === null : 0.7440135592506) 작업 10,000 개에서. 테스트는 30 회 실행되었으며이 수치는 평균입니다.
Justin E


0

is_null($var)$var===null... 37.8ms 대 2.6ms 보다 약 14 배 느립니다 .

그러나 실제로 나는 이유를 모릅니다.


0

사람들이이 토론에서 자주 언급하는 것을 잊는 한 가지는 엄격한 유형 검사에 관한 모든 is_null것이 비교 연산자 (== vs ===)에 오타를 만들지 않도록 도와 준다는 것입니다.

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