나는 isset()만 쓰려고 했는데 다른 사람들은 empty()를 써서 뭐가 다를까하고 찾아보았다. 찾아보니 쓰임새가 달랐다.
<?php
var_dump((bool) ""); // bool(false)
var_dump((bool) 1); // bool(true)
var_dump((bool) -2); // bool(true)
var_dump((bool) "foo"); // bool(true)
var_dump((bool) 2.3e5); // bool(true)
var_dump((bool) array(12)); // bool(true)
var_dump((bool) array()); // bool(false)
var_dump((bool) "false"); // bool(true)
변수가 비어 있는 것인지 여부를 확인합니다. 변수가 없거나 해당 값이 false이면 비어 있는 것으로 간주됩니다. 변수가 없는 경우 empty는 경고를 생성하지 않습니다.
isset(mixed $var
, mixed ...$vars
): bool
변수가 설정된 것으로 간주되는지 확인합니다. 이는 변수가 선언되고 null이 아닌 경우를 의미합니다.
변수가 unset() 함수로 설정 해제된 경우 더 이상 설정된 것으로 간주되지 않습니다.
isset()은 null에 할당된 변수를 검사할 때 false를 반환합니다. 또한 null 문자(“\0”)는 PHP null 상수와 동일하지 않습니다.
여러 매개변수가 제공되면 모든 매개변수가 설정된 것으로 간주되는 경우에만 isset()이 true를 반환합니다. 평가는 왼쪽에서 오른쪽으로 진행되며 설정되지 않은 변수가 발생하는 즉시 중지됩니다.
<?php
var_dump((bool)null); // bool(false)
var_dump((bool)chr(0)); // bool(true) 문자null은 true이다.
주어진 변수가 null인지 여부를 찾습니다.
if($val) or (bool)$val | isset($val) | empty($val) | is_null($val) | |
(선언안함) | false | false | true | true |
$val; | false | false | true | true |
$val=0; | false | true | true | false |
$val=1; | true | true | false | false |
$val=false; | false | true | true | false |
$val=true; | true | true | false | false |
$val=”; | false | true | true | false |
$val=null; | false | false | true | true |
$val=[]; | false | true | true | false |
$val=(object)[]; | true | true | false | false |
$val=’true’; | true | true | false | false |
$val=-1; | true | true | false | false |

주의해야할 부분
- 빈 배열인 경우 isset()과 empty()가 모두 true 이다. ->user list를 DB에서 읽어왔는데, 데이터가 없는 경우 false를 리턴하는지 비어있는 배열을 리턴하는지 확인이 필요하다. 빈 배열을 리턴하는데 isset()를 쓰면 true가 된다. 또한, 빈 배열을 리턴하는 줄 알고 count()를 썼다가 false를 리턴하는 것이었다면 true가 되어버린다.
- empty()와 isset()은 변수가 정의되어있는지에 대해 사용할 수 있는 함수이지만, if문과 is_null()은 그렇지 않기 때문에 주의가 필요하다.
- 없을 수도 있는 변수,배열 인덱스에 if문이나 is_null()을 바로 사용하면 error_reporting에 따라 문제가 생길 수 있다.
<?php
//에러 메시지 숨김
if ( false ) {
ini_set('display_errors',0);
//모든 에러 메시지 활성화
} else {
error_reporting(E_ALL);
ini_set('display_errors',1);
}
if ( $_POST['user_id'] ){
$user_id = $_POST['user_id'];
}
//Notice: Undefined index: user_id in xxx.php on line 13
이 포스팅과 관련없지만, 생각지도 못한 내용이 있어서 남겨본다.
count()의 파라미터에는 배열형만 들어갈 수 있는줄 알았는데, 다른타입이 들어가도 에러가 나지 않았다. count()는 is_array()와 함께 쓸 필요가 있는 것 같다. 매뉴얼을 보니 PHP 7.2 이상부터 error가 난다고 한다.
<?php
var_dump(count([])); // int(0)
var_dump(count(false)); // int(1)
var_dump(count(null)); // int(0)
var_dump(count(0)); // int(1)
var_dump(count('php')); // int(1)

참고
https://www.php.net/manual/en/types.comparisons.php
https://sckim70.tistory.com/14
https://winplz.tistory.com/entry/isset-empty-isnull-unset-함수