isset ← 완전 반대 개념은 아님 → empty
isset 기능은 명확합니다! 변수가 null 값을 가지지 않는지 확인할 때 사용합니다. (참고로, is_null 함수와 정반대 기능을 합니다.) 변수가 null 값을 가지면 false를, null 이외의 값을 가지면 true를 반환합니다. 참고로 선언되지 않은 변수는 기본적으로 null 값을 가집니다. 따라서 isset($선언되지않은변수)를 실행하면 false를 반환합니다.
empty 기능은 조금 덜 명확합니다. 이름에서 기능을 유추해 보면, 변수가 비어 있는지 확인하는 것임을 알 수가 있습니다. 변수가 비어있다는 것이 무슨 의미 일까요? 당연히 선언되지 않은 변수는 비어 있을 것 같은데, 그렇다면 어떠한 값이 선언 되었다는 것은 비어 있지 않다는 것일까요? 결론부터 말하면, 특정 값을 가지고 있어도 비어 있다고 판정하는 경우가 있습니다. 우리는 이런 값들을 거짓 같은 값(falsy)이라고 부르곤 합니다. 예를 들면, 빈 문자열 “”은 비어있다고 생각할 수 있고, 따라서 empty(“”)는 true를 반환합니다. 이렇게 각 자료형마다 falsy값들을 알고 있어야지만 empty를 올바르게 사용할 수 있습니다.
따라서 isset과 is_null은 null 값으로 판단하기 때문에 정반대 개념이라고 할 수 있지만, isset과 empty는 완전히 정반대 개념이라고 할 수가 없습니다. isset과 empty 둘 다 true를 반환하는 경우가 있습니다.
[1] 거짓같은 값 Falsy
아래 표에 falsy 값들과 함께 empty와 isset의 반환값들을 정리해 보았습니다. 먼저 isset의 경우에는 null 값이 아닌 경우 모두 true입니다. 간단하죠.
empty의 경우에는 falsy이면 true, falsy가 아니면 false를 반환합니다. falsy 값은 false랑은 약간 다른 개념으로, falsy는 “변수 == false”가 참인 경우를 말하고, false는 “변수 === false”가 참이 경우를 말한다고 생각하시면 됩니다. 따라서 각 자료형마다 falsy값이 어떤 것들이 있는지 아는 것이 중요합니다.
| 형태 | empty | isset | |
| 문자열 | “” | true | true |
| 문자열 | “0” | true | true |
| 문자열 | ” ” // 스페이스가 들어가 있음 | false | true |
| 정수 | 0 | true | true |
| 실수 | 0.0 또는 -0.0 | true | true |
| 논리값 (불리언) | false | true | true |
| null | null | true | false |
| 배열 | array() 또는 [ ] | true | true |
| 객체 | new stdClass() 또는 (object) [ ] | false | true |
| xml 객체 | simplexml_load_string(‘<root />’); | true | true |
-
- 원시 자료형 경우는 직관에 의존해서 판단하면 비교적 명확합니다.
- 문자열 자료형의 경우에는 빈 문자열 “”, 숫자 “0”이 falsy 값입니다. 약간 주의할 점은 스페이스가 들어가 있는 ” ” 문자열은 falsy가 아닙니다. 따라서 empty(” “)는 false입니다.
- 숫자 자료형의 경우에는 0이 falsy 값입니다.
- 불리언 자료형의 경우에는 당연히 false가 falsy 값입니다.
- null 자료형의 경우에는 당연히 falsy 값입니다.
- ㅤ
- 참조 자료형 경우(배열, 객체)에는 조금 반직관적일 수 있습니다.
- 배열 자료형의 경우에는 아무 배열요소를 가지지 않는 빈 배열인 경우 falsy 이기 때문에 empty는 true입니다. 하지만 isset은 true임에 주의하세요. null이 아니니깐요.
- 객체 자료형의 경우에는 진짜 반직관적입니다. 우리가 흔히 생각하는 빈 객체는 falsy가 아닙니다!! 두둥! 😲 아무런 요소를 가지지 않는 흔히 빈 객체일지라도 empty는 false를 반환합니다. 즉 PHP 내부적으로 뭔가가 들어가 있음을 유추해볼 수 있습니다. 반면 빈 xml 객체는 true 입니다.
- 원시 자료형 경우는 직관에 의존해서 판단하면 비교적 명확합니다.
참조 자료형인 배열과 객체만 추가적으로 예제를 통해 알아 보겠습니다.
[1.1] 배열에서 Falsy
|
1
2
3
|
<?php
var_dump(empty([])); // 빈 객체
?>
|
bool(true)
-
- 빈 배열은 Falsy 입니다. 따라서 empty는 true를 반환합니다.
- 그 외의 모든 경우에는 false를 반환합니다. 예를 들면 이중 빈 배열 empty([ [] ]), 또는 빈 문자열이 들어 있는 배열 empty([”]) 모두 false입니다.
[1.2] 객체에서 Falsy
|
1
2
3
4
|
<?php
$object = new stdClass();
var_dump(empty($object));
?>
|
bool(false)
-
- 우리가 흔히 비어 있다고 표현하는 빈 객체는 비어 있지 않기 때문에 false를 반환합니다. 빈 배열과 다르니 주의 해야합니다.
하지만 특수한 객체인 경우에는 비어 있을 수도 있다. 예를 들어 비어 있는 xml의 경우에는 true를 반환한다.
|
1
2
3
4
|
<?php
$xml = simplexml_load_string(‘<root />’);
var_dump(empty($xml));
?>
|
bool(true)
[2] empty 언어 구성 요소
앞에서 empty에 대해서 알아보았지만, 조금 더 보충 설명을 해보겠습니다. empty의 경우는 is_falsy (실제로 존재하지 않음)와 같은 개념이라고 생각할 수 있습니다. empty라는 이름보다는 is_falsy라는 이름이 더 명확하고 이해하기 쉬운 것 같습니다. 다시 말해서 empty는 “변수 == false”의 결과값이라고 할 수 있습니다. 일치 연산자(===)와는 다르게, 동등 연산자(==)는 자료형을 자동 변환하기 때문에 “변수 == false”는 is_falsy로 생각할 수 있습니다. 이것을 확장시키면 아래의 두 if 절이 동등하다는 것을 알 수 있습니다.
|
1
2
3
|
<?php
if (!$var) { /* $var == false 일 때 */ }
?>
|
위의 코드 if (!$var) 는 아래의 코드 if (empty($var))와 동등합니다.
|
1
2
3
|
<?php
if (empty($var)) { /* $var == false 일 때 */ }
?>
|
참고로 PHP 세계관을 조금 더 깊게 이해하고 싶은 사람들을 위해서 부가 설명을 붙이자면, empty는 함수가 아니라 언어 구성 요소입니다. 따라서 선언되지 않은 변수가 인자로 들어와도 경고 메시지를 발생하지 않습니다. (경고 메시지는 PHP 개발자 모드에서만 볼 수 있고, 에러 메시지와는 다르게 코드가 중단되지는 않습니다.) 따라서 정말 엄밀히 말하면 empty($var)은 단순히 $var == false와 동등한 것이 아니라, !isset($var) || $var == false와 동일합니다. isset 또한 함수가 아니라 언어 구성 요소이기 때문에, 선언되지 않은 변수인 경우 !isset($var)는 true를 반환하고, (null 값이 아닌) 선언된 변수의 경우에는 $var == false로 처리됩니다.
[3] isset 언어 구성 요소
isset은 is_null가 정반대 개념으로 null 값을 가지면 false를, 그 외의 값을 가지면 true를 반환한다고 하였습니다. 따라서 반환값에 대해서 딱히 추가할 내용은 없지만, isset은 인자를 여러개 받을 수 있기 때문에 관련 내용을 잠시 언급하고자 합니다.
|
1
2
3
4
|
<?php
$a = 1; $b = 2; $c = 3;
var_dump(isset($a, $b, $c)); // bool(true)
?>
|
bool(true)
-
- isset의 모든 인자들이 null 값이 아닐 때는 true를 반환합니다.
|
1
2
3
4
|
<?php
$a = 1; $b = 2; $c = null;
var_dump(isset($a, $b, $c)); // bool(false)
?>
|
bool(false)
-
- isset의 인자 중 하나라도 null값을 가지면 false를 반환합니다.
[4] 정리
isset과 empty는 정반대 개념이 아닙니다. isset은 is_null의 정반대 개념이고, empty는 (존재하지는 않지만) is_falsy라고 이해하시면 됩니다. 따라서 empty값을 이해하려면, 각 자료형마다 falsy 값들이 뭔지를 알고 있어야 합니다. 이번 포스트의 표에 잘 정리되어 있으니 참조하시면 될 것 같습니다.




