[PHP] Distinction Null and Undefined

TL;TR

<?php array_key_exists('value', get_defined_vars()) ?>


대게 주의에선 PHP에선 Null과 Undefined를 구별하지 못한다고 알려져 있다.
나 또한 Null과 Undefined를 구별할 수 있는 방법이 없다고 생각했지만, 성능상의 이슈를 제외하고, PHP에서도 Null과 Undefined를 구분 할 수 있다.

<?php 
    $a = null;
    var_dump(isset($a), isset($b));
    // Result : bool(false) bool(false)
    var_dump($a, $b);
    // Result : NULL NULL
?>

PHP에서 변수의 유효성을 확인하기 위해 가장 많이 사용되는 함수인 isset은 해당변수가 ‘정의 되어 있지 않’거나 변수의 값이 ‘Null’인 경우에 false를 반환한다.

즉, php의 변수의 유효성을 판단하기 위한 함수은 isset은 ‘정의되지 않음’과 ‘Null’을 구별 하지 못한한다.

또한, 6번째 줄의 결과값을 보면 $a$b의 출력값은 NULL로 동일하다.
(물론 php Notice가 b는 선언되어있지 않다고 알경고를 띄워주기는 한다.)

JS와 같이 php와 같이 공부를 많이하는 언어의 경우
undefined라는 타입이 있으며, value == undefined와 같이 사용이 가능하기에
php에선 구분이 불가능하다 라고 알려진것같다.
(적어도 나는 이렇게 생각했다…)

하지만 PHP에서도 undefined와 Null을 구별할 수 있는데 이는 get_defined_vars()를 사용해 현재 선언된 변수들의 목록에서 찾는 방법이다.

<?php
    $a = null;
    var_dump(array_key_exists('a', get_defined_vars()), array_key_exists('b', get_defined_vars()));
    // Result : bool(true) bool(false)

    unset($a);
    var_dump(array_key_exists('a', get_defined_vars()));
    // Result : bool(false)

퍼포먼스 상으론 그렇게 좋은 방식은 아닌것 같지만, 이를 통해서 해당 변수가 정의되어있는지 단순히 null인지 확인 할 수 있는 확실한 방법이다.
(이외의 다른 방법이 있다면 댓글로..)

글의 문제가 있다면 댓글을 달아 주세요.

This site uses Akismet to reduce spam. Learn how your comment data is processed.