2014-12-09 4 views
24

- 나는 꽤 많은 약 빈()는 isset을 알고있다()이 그들을 사용하는 가장 적절한/효율적인 방법은 무엇 내가 요구하고있다. 변수가 존재하지 않는 경우 어떤 경고가 생성되지 않습니다empty() 충분하거나 isset()을 사용합니까?

:

난 그냥 empty() 기준에 따라 php.net이 문장에서 본했습니다. 즉, empty()은 근본적으로 과 간결하게 동일합니다! isset ($ var) || $ var == false.

하지만 주로 다른 사람의 애플 리케이션 (중 독립 프로젝트, CMS 또는 프레임 워크를 사용하여 웹 사이트)에 지금 많은 많은 시간을 일하고 있어요으로 다시, 내가 본 사람들은 쓰기 :

if (isset ($var) && $var != '') 
// or 
if (isset ($var) && !empty($var)) 

(주로 $ _GET과 $ _POST 변수뿐만 아니라 함께)

는 지금까지 내가 수동 이해, 아래 니펫을 는 것과 같습니다

if (!empty($var)) 

아니면 뭔가 빠졌습니까? 가치가있는 변수 존재를 확인하는 것이 기술적으로 가장 좋은 방법은 무엇입니까?

둘 다 목적지를 알고 있습니다. 나는 empty()이 모두 변수 주어진 값이 인 경우 을 확인해야하는지 알고 싶습니다. 나는 그것이 효과가 있다는 것을 알고 있지만 그것이 100 % 적절하고 안전합니까?

+1

답은'예'입니다. –

+0

'empty()'가 선호되는 방법입니다. –

+0

나는 빈 것을 사용합니다. 체크 할 필요가 없기 때문입니다. 설정되었거나되지 않았지만,주의해야합니다! 예를 들어, 텍스트 입력의 유효성을 검사하고 확실하게 입력해야한다면, 그냥 채워져 있고, 무엇이 포함되어 있어도 상관 없습니다. 'isset'과'strlen'을 사용하십시오. 왜냐하면 0은 비어있는 경우 true를 반환하기 때문입니다. – vaso123

답변

19

연산 코드는 그래서 네는하지만 ISSET_ISEMPTY_VAR를 반복 않습니다 !empty($var)

line  # * op       fetch   ext return operands 
--------------------------------------------------------------------------------- 
    3  0 > EXT_STMT             
     1  ISSET_ISEMPTY_VAR      11800000 ~0  !0 
     2  BOOL_NOT           ~1  ~0 
     3  FREE              ~1 
    4  4 > RETURN              1 

에서 isset($var) && !empty($var)

line  # * op       fetch   ext return operands 
--------------------------------------------------------------------------------- 


    3  0 > EXT_STMT             
     1  ISSET_ISEMPTY_VAR      12800000 ~0  !0 
     2 > JMPZ_EX          ~0 ~0,  ->6 
     3 > ISSET_ISEMPTY_VAR      11800000 ~1  !0 
     4  BOOL_NOT          ~2 ~1 
     5  BOOL           ~0 ~2 
     6 > FREE            ~0 
    4  7 > RETURN            1 

및 에서 발생! $empty. 전달 된 값에 따라 다르지만 가장 좋은 방법은 하나의 opcode가 아닌 BOOL_NOT입니다. 그러나 그것이 존재한다면, 가장 밑의 방법이 더 빠릅니다.

은 가능성이 있지만이 모든 응용 프로그램

+0

나중에 보게 될 것입니다. 나는 그들이 어떻게 잘 될지 잘 모르겠습니다. – exussum

4

isset은 값 (null, false 등)에 관계없이 변수가 설정되어 있는지 간단히 알려줍니다.

값이 공 문자열이 아닌지 테스트하려면 null, false 또는 0을 empty으로 지정하십시오.

+0

'isset'은'exists'를 의미합니까? – Banzay

+3

@Banzay 변수가 선언되었고 null이 아님을 의미합니다. – Forien

13

empty으로 충분하지만 그 결과에 유의하십시오. $var0, '0', false, '', [], null (내가 잊고 아마도 몇 가지 다른) 중 하나 인 경우

는, 그것은 확실히 isset 간주되지만, 그것은 또한 empty 될 것입니다. 문자열은 '0'입니다.

개인적으로 나는 isset만을 사용합니다. 값이 empty이 아닌 경우, 별도로 확인하고 적절한 오류 처리 블록에서 오류를 던져 사용자에게 간단하고 정확한 "이 값이 필요합니다"라는 오류를 표시합니다.

+1

(사이드 노트, 왜 NaN은 PHP에서 truthy 값으로 간주됩니까?) –

+0

PHP에서 NaN이란 무엇입니까? –

+1

'NaN'은 php에 존재하지 않고 오직 javascript ;-) – fire

3

! (empty ($ var))를 사용하면 변수가 설정되고 ""또는 null 또는 0과 같이 비어있을 수있는 값이 포함됩니다.

if(!empty($_COOKIE['dev'])) echo 'developer mode'; 

쿠키가 비어 있거나 값으로 채워진 경우 조건은 true입니다. 그렇지 않으면 무시됩니다.

배열 작업을하고 경고를 피하기 위해 키가 설정되어 있는지 여부를 모르는 경우 유용합니다.

3

당신이 유용이는 isset과 IsEmpty 함수 사이 $ _POST와 $ _GET의 차이를 평가에 병목 될 것입니다. 당신이 말했듯이 empty() var는 isset을 의미하고 값은 전송되었습니다.

그래서

if (!empty($var)) 

은 당신이 누락 것은 그냥 가끔

if (isset($var)) { 
    if ($var != '') { 

    } else { 
    ... do "A" 
    } 
} else { 
    ... do something different from "A" 
} 

은 당신이해야 할 수도 있습니다 ceratinly 충분히

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

입니다. 그리고 이런 일이 자주 발생하면 조건이 충족되면 두 조건을 병합하고 empty()를 잊어 버릴 수 있습니다. 이미 확인한 바 있습니다. 나는 "빈"을 사용하는 것이 빠를 수도 있지만 내부적으로는 아마 같은 검사를한다고 생각한다.

2

GET/POST/COOKIE 변수는 filter_input 함수로 검사해야합니다. 이 함수는 지정된 키가 입력 (GET/POST/COOKIE/etc)에 있는지 확인하고 선택적으로 필터링 할 수 있습니다. 예 :

$id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT); 
/* 
* QUERYSTRING   RESULT 
* ================== =============== 
* test.php?    $id is NULL 
* test.php?id=   $id is FALSE 
* test.php?id=123abc $id is FALSE 
* test.php?id=123  $id is int(123) 
*/ 
if ($id !== NULL && $id !== FALSE) { /*...*/ } 

변수 설정, 또는 그 값이 falsy하지 않으면 한편 empty() 기능은 단순히 확인한다. 이 함수는 거짓 값이 의미가있는 상황에서는 사용할 수 없습니다.

if (empty($_GET["number_of_children"])) { 
    /* 
    * GET parameter is not set or its value is zero or falsy 
    * Show an error? Or process the value? 
    */ 
} 
if (empty($_GET["number_of_children"]) === false) { 
    /* 
    * Definitely a truthy value 
    * But how does one specify that he/she has no children? 
    */ 
}