프로그래밍/PHP

empty() 함수 사용 주의점

채윤아빠 2019. 9. 3. 11:03
728x90
반응형




empty() 함수는 이용하여 해당 변수가 비어 있는지 이용합니다. 비어 있는지를 확인하는 범위가 일반적으로 생각하는 것보다 범위가 무척 넓습니다.

일반적으로 문자열이라면, "" 및 null을 비어 있다고 볼 수 있겠고, " " 공백 한 문자도 경우에 따라서는 비어 있다고 할 수 있겠습니다.

하지만, PHP empty() 함수가 비어 있다고 판단하는 범위는 아래와 같습니다.

  • 변수 자체가 선언(undefined)되어 있지 않음
  • null
  • ""
  • 0
  • false
  • 0.0
  • "0"
  • array() ; 빈 배열

아래 empty() 함수를 사용한 예제를 확인해 보시기 바랍니다.

$test = null;
if (empty($test))
    echo "[1] test is empty()!!<br />\n" . $test;

$test = "";
if (empty($test))
    echo "[2] test is empty()!!<br />\n";

$test = " ";
if (empty($test))
    echo "[3] test is empty()!!<br />\n";

$test = " ";
if (empty(trim($test)))
    echo "[4] test is empty()!!<br />\n";

if (empty($test2))
    echo "[5] test2 is empty()!!<br />\n";

if (!isset($test2) || $test2 == false)
    echo "[6] test2 is empty()!!<br />\n";

$test2 = "0";
if (empty($test2))
    echo "[7] test2 is empty()!!<br />\n";

$test2 = "00";
if (empty($test2))
    echo "[8] test2 is empty()!!<br />\n";

$test2 = "0.0";
if (empty($test2))
    echo "[9] test2 is empty()!!<br />\n";

$test2 = 0.0;
if (empty($test2))
    echo "[10] test2 is empty()!!<br />\n";

$test2 = false;
if (empty($test2))
    echo "[11] test2 is empty()!!<br />\n";

위 코드를 실행한 결과는 아래와 같습니다.

[1] test is empty()!!
[2] test is empty()!!
[4] test is empty()!!
[5] test2 is empty()!!
[6] test2 is empty()!!
[7] test2 is empty()!!
[10] test2 is empty()!!
[11] test2 is empty()!!

PHP 개발시, empty() 함수를 이용할 때, isset() 함수까지 대체하여 사용하실 수 있으나, 내가 원하는 결과에 맞게 나올지는 고민하고 사용하셔야 합니다.

특히, "0" 까지도 빈 것으로 판단을 하므로, 실제로는 숫자인 것으로 문자열 자료를 empty() 함수로 빈 문자열인지 확인할 때, 의도한 것과는 다르게 동작할 수 있으므로 주의가 필요합니다.

무조건 empty() 함수를 이용하는 것보다는 프로그램의 흐름에 맞게 isset() 함수와 실제 처리 로직에 맞추어 값을 비교하는 방식으로 코딩을 하면 실수를 줄 일 수 있습니다.

// 문자열 변수가 비었는지 확인하기 ; " "은 비어 있다고 판단, "0"은 비어 있지 않음
if (!isset($string_variable) || trim($string_variable)) {
    die("문자열을 제대로 입력하여 주시기 바랍니다.");
}

// 숫자 자료형인지 확인하기
if (!isset($string_variable) || !is_numeric($string_variable)) {
    die("올바른 숫자를 입력하여 주시기 바랍니다.");
}