php에서 절대 empty 함수를 사용하지 마라

Gunny Park·2024년 2월 27일

출처: https://dev.to/klnjmm/never-use-empty-function-in-php-4pb0

php에서 배열을 확인하는 몇가지 방법 중에 하나는 종종 자주 아래의 코드를 본다.

$var = [];

if (empty($var)) { ... }

위 코드를 읽어보면 너는 즉시 이것이 무엇을 하는지 알 것이다. 이 함수의 이름은 꽤 알려진 함수이기때문이다. 그러나 문제는 empty 함수는 배열만 확인하기위한 함수가 아니라는 것이다.

empty 함수는 아래 코드처럼 사용된다는 것을 너는 아니?

$var = [];

if (
    isset($var) === false
    || $var === false
    || $var === 0
    || $var === -0
    || $var === 0.0
    || $var === -0.0
    || $var === ''
    || $var === '0'
    || $var === []
) { ... }

여기서 우리는 empty 함수를 사용하여 변수가 int 타입이라면 0과 같은지 또는 변수가 string 타입이라면 값이 없는 문자인지 확인할 수도 있다는 것을 명확하게 볼 수 있습니다. 그리고 empty 함수의 문제는 너무 많은 것들 확인(검사)하고 버그들을 발생시킬 수 있다.

예를 들어, 에러 없이 선언되지 않은 변수가 empty 함수와 함께 있는 테스트는 오류 없이 true를 반환합니다. 만약 너가 너의 변수의 이름에서 실수를 한다면 버그가 발생할 수 있다.

$var = [1, 2, 3];

var_dump(
    empty($errorVar)
); // bool(true)

그러므로 더 좋은 테스트는 즉시 아래처럼 작성하는게 좋다.

var_dump(
    $errorVar === []
); // bool(false)
/*
 * With php < 8 : Notice: Undefined variable: myErrorVar in /in/Nm3CT on line 8
 * With php >= 8 : Warning: Undefined variable $myErrorVar in /in/Nm3CT on line 8
 */

무엇이 바람직한 메소드인가?
배열이 비어있는지 확인하기위해서는 나는 너가 아래 코드 중 하나를 사용하기를 제안한다.

$var = [];

if (count($var) === 0) {...}
// ou 
if (sizeof($var) === 0) {...}

나의 가장 좋은 해결책은 아래 코드입니다.

$var = [];

if ($var === []) {...}

그리고 더 일반적으로 나는 너의 용어와 일상 생활에서 empty란 함수를 금지했으면 합니다.

int인 타입의 변수가 0인지 확인하고 싶나요?

$var === 0

string인 타입의 변수가 비어있는 값(문자열에 아무 값도 없는 값)인지 확인하기를 원하나요?

$var === ''

이전에 선언되었거나 초기화된 변수의 변수값이 null인지 확인하기를 원하나요?

$var = null;

if ($var === null) {...}

변수가 존재하고 변수의 값이 null과 다른지 너가 확인하고 싶다면 너는 반드시 isset 함수를 사용해야 합니다.

isset($var)

만약 내가 몇가지 것들을 같은 조건문에서 확인하기를 원한다면 어떻게 해야할까요?
만약 예를 들면, 너가 너의 변수의 값이 null이 아니고 변수의 값이 빈 문자열이 아닌 확인하고 싶다면 너는 두 조건을 함께 사용할 수 있습니다.

if ($var !== null && $var !== '')

명시적인 이름을 가진 private 메소드를 아래 코드처럼 생성할 수 있다.

private function isTokenValid(?string $token): bool
{
     return $token !== null && $token !== '';
}

// in the condition
if ($this->isTokenValid($var)) {...}
profile
ASD programmer

0개의 댓글