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인지 확인 할 수 있는 확실한 방법이다.
(이외의 다른 방법이 있다면 댓글로..)