웹마스터 팁

만약 지금 여러분이 C나 PERL 프로그램을 해보신 적이 있다면, PERL이 C에 비하여 상당히 변수처리에 있어서 쉽다는 것을 아실 것입니다.. (쉽다고 하기 보다는 유연하다라는 말이 어울리겠네요.) PHP에서의 변수는 PERL에서의 변수처리와 상당히 비슷합니다.


PHP에서의 변수형

PHP에서 변수는   integer(정수형) , double(실수형) ,  string(문자열) , array(배열) , object(객체) 다섯가지가 있습니다.

변수란 말그대로 변함을 의미합니다.
PHP에서 $hancoma 처럼 변수임을 나타내기 위해 변수명 앞에 "$" 표시가 붙습니다. PHP에서 변수는 C에서, 변수의 타입을 미리 선언하는 것과는 달리 PERL에서와 같이 그 변수가 담고 있는 값에 따라서 변수형이 자동으로 결정됩니다. 따라서 변수가 담고 있는 값의 형태가 숫자에서 문자열로, 혹은 문자열에서 숫자로 변할때마다 변수의 타입도 자동으로 바뀌게 됩니다.

<HTML>
<BODY>
<?
     $a = "hancoma";
     $b = "1000";

     echo "$a - $b";

     $a = "1000";
     $b = "hancoma";

     echo "$a - $b";

?>
</BODY>
</HTML>


위와 같은 PHP예제가 있다고 할때, 실행값은

hancoma - 1000
1000 - hancoma

입니다. 즉, 변수형이 숫자에서 문자열로, 문자열에서 숫자로 자유롭게 변함을 알수 있습니다.

배열변수

PHP에서 배열은 두 가지 종류가 있습니다. 하나는 우리가 흔히 생각하는 배열로 단일값을 원소로 갖는 스칼타배열(scalar array)이고 다른하나는 키(key)와 값(value)의 쌍을 하나의 원소로 갖는 연관배열(associative array)입니다. (연관배열은 PERL에서 hash와 같음)

PHP에서 배열 변수를 정의하고 여기에 값을 할당하는 방법은 두가지가 있습니다.

첫번째 방법은 아래의 예제처럼 인덱스를 명시하지 않은채 배열변수에 차례로 값을 할당하는 방법으로 이경우 값이 할당되는 순서에 따라 배열 원소의 순서가 결정됩니다. 배열원소의 인덱스는 C , PERL과 같이 0에서 부터 시작됩니다.

$hancoma[] = "PERL";  // $hancoma[0]
$hancoma[] = "CGI";  // $hancoma[1]
$hancoma[] = "ASP";  // $hancoma[2]
$hancoma[] = "PHP";  // $hancoma[3]

위의 예제와 같은 코드가 있을 경우 $hancoma[2] 는 ASP 가 되는 것입니다.

둘째는 PHP에서 지원하는 배열 생성함수 array()를 이용한 방법입니다.

$hancoma = array("PERL","CGI","ASP","PHP");

위의 예제에서도 앞의 예제와 마찬가지로 $hancoma[2] 는 ASP가 됩니다.. 즉, 배열이 만들어지는 방법이 다를 뿐입니다.

다음은 연관배열에 대한 설명입니다. 연관배열은 " => " 기호로 구성되는데, 기호의 왼쪽은 참조키 오른쪽은  그 참조키에 대한 값이 됩니다.

$hancoma = array("PERL"=>"A" , "CGI"=>"B" , "ASP"=>"C", "PHP"=>"D");

위와 같은 연관배열이 있다고 할때, $hancoma[PHP] 의 값은 "D" 가 됩니다. 어떤 참조키에 따른 값을 알고자 할때, 상당히 유용하게 사용되어짐을 짐작할 수 있을 것입니다.

객체(OBJECT)형 변수

PHP에서 또 하나의 변수 타입인 객체는 클래스(Class)를 통해서 생성되며 New 연산자를 통해 초기화 됩니다. 이것은 Java 나 C++ 같은 객체지향 언어에서 흔히 사용되는 방식입니다.

<?

class hancoma {
   function hancomaworld() {
        echo "hancomaworld 함수입니다.";
   }
}

$var = new hancoma;
$var->hancomaworld();

?>

위에서, $var 는 hancoma 클래스 객체를 생성하여 할당함으로서 $var라는 변수는 hancoma클래스의 클래스함수인 hancomaworld() 함수에 접근하여 호출할 수 있게 됩니다. 클래스에 포함된 함수에 접근하기 위해서 " -> " 연산자가 사용되며, 위의 결과값은 "hancomaworld 함수입니다." 가 출력되게 됩니다.
PHP를 이용한 프로그램에서, 클래스는 하나의 모듈처럼 사용되어 지는데, 이러한 클래스에 대한 경험이 없어 개념이 잘 파악되지 않을 경우 C++입문서나, JAVA관련서적을 참고하시면 도움이 되실 것입니다..

클래스의 개념을 말할때, 빠지지 않는 것이 자동차와 차바퀴의 비유입니다. 자동차는 네개의 바퀴가 달려 있습니다. 즉 바퀴라는 클래스가 있다고 할때, 그 바퀴클래스만 있으면, 네개의 바퀴를 쉽게 만들어 낼 수 있다는 것입니다.

변수의 사용범위 - 전역변수와 지역변수

변수는 그 사용에 있어서 범위가 주어집니다. 한곳에서 사용된 변수가 다른 곳에서 사용될 수도 있고 없고 하는 것은 바로 변수의 사용에 있어서 범위가 있기 때문입니다. 이러한 변수는 사용범위에 있어서 전역변수(global variable) 와 지역변수(local variable)로 구분됩니다.

<?

$a = "10";

function hancoma() {
    echo "$a";
}

hancoma();

?>

위의 코드의 결과값은 아무것도 없습니다. 분명히 hancoma() 라는 함수를 정의해 주고 hancoma(); 호출을 해주었습니다. 그렇다면, $a의 값이 10이므로 10이 출력되어야 할 것 같으나 결과는 아무것도 없습니다.

출력값이 없는 이유는 변수 $a 가 지역변수이기 때문입니다. 이 변수를 hancoma() 함수내에서도 사용할 수 있도록 전역변수화 하는데, 이때 필요한 것이 global 선언입니다.

<?

$a = "10";

function hancoma() {
global $a;

    echo "$a";
}

hancoma();

?>

위의 코드는 hancoma() 함수안에 global $a; 가 첨가되었습니다.. 즉, 변수 $a를 전역변수로 사용한다고 선언한 것입니다. 그러므로 위의 코드의 결과값은 "10" 이 출력되어 집니다. global 선언은 변수가 여러개 일때, global $변수1,$변수2,$변수3;과 같이 콤마(,)로 구분해 주시면 됩니다.

FORM을 통해 전달된 값의 사용

CGI에서, HTML의 FORM을 통해 들어오는 데이터들은 파싱(Parsing)이라는 과정을 거쳐서 변수로서 사용할 수가 있습니다. PERL CGI에서 가장 까다로운 부분이 바로 이러한 파싱부분입니다. 이러한 CGI와는 달리 PHP에서는 파싱과정이 필요 없습니다.

 

if($ENV{'QUERY_STRING'}) {
@pairs = split(/&/,$ENV{'QUERY_STRING'});
}
else {
read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'});
@pairs = split(/&/, $buffer);
}

foreach $pair (@pairs) {
($name, $value) = split(/=/,$pair);

$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;

$FORM{$name} = $value;
}

위의 코드는 PERL에서, FORM의 name과 value를 $FORM{'name'} = $value 의 형태로 바꿔주는 파싱부분입니다. 위와 같은 파싱부분이 PHP에서는 없기 때문에 코딩상에 있어서 상당히 수월해 집니다.

<INPUT TYPE=TEXT NAME=name VALUE=한꼬마>

과 같은 HTML 입력폼이 있다고 가정할 때, PHP에서는 파싱 과정 없이 곧바로 $name 이라는 변수가 만들어지고 $name에는 그 입력폼에 입력한 값이 대입되어 집니다. 만약    라는 폼이 있는데 이 폼의 name이 hancoma라면 $hancoma = "한꼬마"; 가 되는 것입니다.