메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

한빛출판네트워크

한빛랩스 - 지식에 가능성을 머지하다 / 강의 콘텐츠 무료로 수강하시고 피드백을 남겨주세요. ▶︎

IT/모바일

PHP에서 범하기 쉬운 일반적인 코딩 스타일 실수 - 1부

한빛미디어

|

2003-06-12

|

by HANBIT

14,499

저자: John Coggeshall

소개

이번 기사에서는 웹 애플리케이션을 작성할 때 중요한 것 중에 하나인 보안에 대해서 소개하겠다. 단지 신용카드나 다른 개인 정보들을 보호한다는 것은 아니라 코드 작성시 안전하게 작성하는 방법을 소개하려고 한다. 이런 주제로 - 난 "PHP 편집증"이라 부른다 - 태스크를 처리하는데 필요한 함수 호출 뿐만 아니라 안전하게 프로그래밍하는 처리 과정을 실졔 연습을 통해 설명할 것이다.

처음에는 PHP 초보자들이 흔히 범하기 쉬운 코딩 스타일 측면에서의 실수를 지적하면서 시작한다.

스타일에서의 실수

(스타일 에러가) 비록 치명적인 에러는 아닐지라도 나쁜 코딩 스타일 습관은 규모가 큰 개발 프로젝트에서 많은 문제를 일으킬 수 있다. 이러한 나쁜 코딩 스타일은 새로운 PHP 버전으로 업그레이드할 때 분명히 나타나며 개발 시간도 지연 시킨다.

나쁜 코딩 스타일과 좋은 코딩 스타일의 차이점을 분명히 알아보기 위해 아래 예제들을 살펴보도록 하자.

팁 1: 부가적인 설정 지시자를 피해라.

다음 코드를 살펴보자.
";
    myfunc(&$var);
    echo "The value of the variable is: $var
"; ?>
이 코드는 비록 동작은 하나 적절히 기능을 하기 위해서는 PHP 설정 지시자에 의존한다. 예를 들어, 만약 PHP 설정 지시자 short_tags가 비활성화 되었다면 무슨 일이 생길까? 이 코드는 PHP 블록을 시작하기 위해
변수 $var가 함수에 전달되는 방법에도 문제가 있다. 레퍼런스 형태로(call by reference) 변수를 함수에 전달하는 것이 비록 문제될 것은 없지만 함수 선언 자체가 레퍼런스를 허락하고 있지 않다. 이러한 에러를 무시하도록 하는 설정 지시자 allow_call_time_pass_reference가 있기는 하다. 그러나 새로운 PHP 버전을 고려한다면 작성한 코드가 동작하지 않을 수도 있다. 레퍼런스 형태로 변수를 전달할 때 함수가 레퍼런스를 허락하도록 선언되었는지 확인하는 것은 매우 중요하다.
function myfunc(&$myvar) {
    $myvar = 1;
}
팁 2: 곧바로 값을 리턴하는 함수는 사용하지 마라.

PHP 개발자들이 범하기 쉬운 또 다른 코딩 스타일 실수는 다른 함수를 위한 파라미터로써 함수로부터 곧바로 리턴된 값을 사용하는 경향이 있다. 다음 코드를 살펴보자.
 10) ? strlen($mystring) - 10 : 0)),
        strtoupper(substr($mystring,
            rand(0,strlen($mystring))))) == 0) ? true : false;
?>
이 같은 코드도 물론 동작은 하지만 이 코드가 무엇을 하는지 쉽게 말할 수 있는가? 코드를 실제로 작성하지 않은 사람이라면 내용을 파악하기가 더 어려울 것이다. 이러한 요소도 또한 스크립트를 작성하는 방법에 영향을 줄 것이다. 아래에 더 쉽게 읽을 수 있는 코드가 있다.
 10) ? $str_len - 10 : 0;
    $start_rand  = rand(0, $str_len);
    $substr_rand = substr($mystring, $start_rand);
    $substr_base = substr($mystring, $start_pos);
    $substr_rand = strtoupper($substr_rand);
    $substr_base = strtoupper($substr_base);

    if(strcmp($substr_base, $substr_rand) == 0) {
        $my_variable = true;
    } else {
        $my_variable = false;
    }
?>
이제 코드가 무엇을 의미하는지 알 수 있겠는가? 가독성을 위해서는 기꺼이 몇 라인 더 작성하는 수고를 아끼지 않아야 한다. 언젠가는 보상을 받게 될 것이다^^. 만약 곧바로 리턴된 값을 사용해야만 한다면, 모든 함수들 중에 파라미터의 혼합된 수가 3개 이하일 경우에는 대부분의 경우에 받아질 수는 있다.

이 경우에 단지 두개의 파라미터를 사용하여 substr() 함수를 호출하고 있다. 파라미터 중에 하나는 단지 한 개의 파라미터를 받는 strtoupper() 함수이다. 이 구문에는 모두 세개의 파라미터만이 있기 때문에, 원한다면 한라인으로 적절하게 사용할 수 있다.

다른 함수에서 곧바로 리턴된 값을 사용할 때가 다수 있더라도 함수 호출 파라미터로써 조건 할당 문은 사용하지는 말아야 한다.
 10) ?
                                         strlen($myvar) - 10 : 0);
?>
팁 3: 적절하지 않는 배열 문법을 사용하지 마라.

일반적인 문법 실수가 스트링-인덱스 배열을 사용할 때 생기곤 한다. 다음과 같은 코드는
"Your index was foo", "bar"=>"Your index was bar");
    echo $myarray[bar];
?>
브라우저에 "Your index was bar"를 출력할 것이다. 그러나 다음과 같은 거의 동일한 스크립트는 원하는 대로 동작하지 않는다.
"Your index was foo", "bar"=>"Your index was bar");
    echo $myarray[bar];   
?>
기대했던 출력과는 달리 이 스크립트는 브라우저에 "Your index was foo"를 출력할 것이다. 이 경우에 상수 bar를 foo로 정의했기 때문에 PHP는 bar의 각 인스턴스를 문자열 foo로 대체한다. 여기서 사용된 배열 인덱스가 명시적으로 스트링이라고 명시되지 않았으므로 자동적으로 foo라는 값으로 대체된다. 그래서 echo 문은 상수(스트링이 아님) bar에 의해 정의된 배열 인덱스에 저장된 값을 출력한다. 이러한 혼돈을 방지하기 위해서는 아래에 보여진 것 처럼 배열 인덱스("bar")를 정의하는 것이 중요하다.
echo $myarray["bar"];
작성한 스크립트에 상수가 정의되지 않았을 경우에라도 차기 PHP 버전에서 새로운 상수가 소개되지 않으리라는 보증은 없으며, 이것은 바람직하지 않는 결과를 나을 수도 있다. 그러나 이러한 규칙에도 한가지 예외는 있다. 예를 들어 스트링 안에서 배열 인덱스를 참조할 때 아미 아래와 같은 문법에 익숙할 것이다.
echo "My Value {$myarray["bar"]}";
이 경우에는 배역 $myarray안에 있는 bar 키값과 관련된 값을 출력할 것이다. 이 배열이 스트링 내부에 있기 때문에 이 구문은 아래와 같이 간단하게 표현할 수 있다.
echo "My Value $myarray[bar]";
PHP 코드를 계속 사용하려면 위에서 언급한 두 예제를 잘 활용하기 바란다. 언젠가는 차이점을 알 수 있을 것이다.

계속

"PHP 편집증 시리즈" 컬럼의 첫번째를 끝마친다. 이미 여러분의 품질 좋은 PHP 코드를 작성하는 길에 접어들었다. 하지만 아직은 아니다. 논의해야 할 코딩 스타일 실수가 아직도 많이 있다.

Johin Coggeshall은 웹 컨설턴트이자 그래픽 디자이너 이며, 10년 이상의 개발 경력과 5년 이상의 PHP 경력을 가지고 있다.
TAG :
댓글 입력
자료실

최근 본 상품0