PHP에서 주의해야 할 논리 연산

PHP에서는 변수의 자료 형을 선언하지 않습니다. 값을 따옴표( ” 또는 ‘ )로 감싸서 변수에 대입하면 문자열 형이 되고 123 과 같이 숫자를 대입하면 정수 형이 됩니다. 또한 new Object()처럼 인스턴스를 대입할 수도 있습니다. 이는 매우 유연하게 변수의 자료 형을 바꿀 수 다는 장점이 있습니다만 반면 변수가 어떤 형태인지 직관적으로 알 수 없는 단점이 있습니다.

자료 형을 알기 어렵기 때문인지 아래와 같은 코드를 매우 자주 볼 수 있습니다.

if ( ! $var ) echo “FALSE”;

코드 1 변수가 부정일 때

코드는 매우 직관적입니다. $var 변수가 부정(Not)일 때 FALSE를 출력합니다. 하지만 $var 변수가 어떻게 부정이 될지는 알 수 없습니다. 위 코드에서 $var가 부정이 되어 FALSE를 출력하는 경우는 다음과 같은 경우의 수가 있습니다.

  • $var = “”;
  • $var = 0;
  • $var = “0″;
  • $var = NULL;
  • $var = FALSE;

자료 형을 선언할 수 없기 때문에 $var가 어떤 자료 형을 갖고 있던 상관없이 부정이 될 수 있는 모든 형태를 비교합니다. 이로 인해서 생각하지 못했던 버그가 발생할 수 있습니다.

<?php

 

$var = $_GET['var'];

 

if ( ! $var ) {

echo “var value is FALSE”;

exit();

}

if ( $var >= 0 ) echo “var >= 0 “;

 

?>

코드 2 버그가 발생할 수 있는 코드( test.php )

위 코드 2에서는 $var 값이 0 이상인 경우 “var >= 0″을 출력하도록 되어 있습니다. 하지만 웹 브라우저를 통해 http://localhost/test.php?var=0 를 실행하면 “var value is FALSE” 가 출력됩니다.

코드 2가 의도했던 바는 $_GET['var'] 값이 빈 문자열인 경우에 “var value is FALSE”를 출력하려고 했던 것 같습니다. 그게 아니라면 if ( $var >= 0 ) 이 아니라 if ( $var > 0 ) 를 원했던 것 일지도요.

어찌되었든 if ( ! $var ) 조건 문 때문에 코드를 작성한 사람이 의도하는 대로 동작하지 않는 다는 것은 확실합니다. 더불어 제 3자가 코드를 봤을 때 의도를 명확하게 파악할 수 없습니다.

코드 2의 코드를 아래와 같이 코드를 변경하면 버그를 없애고 의도를 명확히 할 수 있습니다.

<?php

 

$var = $_GET['var'];

 

// 입력된 값이 숫자가 아닌 경우 에러 메시지를 출력합니다.

if ( is_numeric($var) == FALSE ) {

    echo “var value is Not a Number.”;

    exit();

}

 

if ( $var >= 0 ) echo “var >= 0 “;

 

?>

PHP에서 논리 연산을 할 때에는 이러한 점을 조심해야 합니다. TRUE, FALSE 는 옳고 그름이 명확한 만큼 잘못된 연산은 전혀 다른 결과를 가져올 수도 있습니다. 그러므로 명확하지 않은 if ( ! $var ) 과 같은 조건 문은 피하는 것이 좋습니다.

About the Author

ooti has written 46 stories on this site.

3 Comments on “PHP에서 주의해야 할 논리 연산”

  • 에프제트 wrote on 20 May, 2009, 10:40

    좋은 내용 감사합니다..^^
    개인적으로는 “0″이 false라서 문제된적이 많았던거 같네요

  • kirrie wrote on 26 May, 2009, 10:36

    더불어, empty도 같은 판단을 합니다. 때문에 type까지 확실히 비교하기 위해선 === 연산자를 사용해야 합니다.

  • ooti wrote on 26 May, 2009, 13:19

    kirrie님께서 empty 말씀을 하신 김에 ^^ empty( ) 함수도 살짝 꺼내봅니다.
    변수가 비어 있는지를 확인할 때에는 $var == “” 를 쓰기도 하지만 empty() 함수를 쓰는데요. 이 empty() 함수도 0 을 빈 것으로 판단하기 때문에 조심해야 합니다.

Write a Comment

Gravatars are small images that can show your personality. You can get your gravatar for free today!

Spam Protection by WP-SpamFree

Copyright © 2010 PHPK.org. All rights reserved.
Theme by Fitobochka and ComFi.com Phone Cards Company.