변수(變數, Variable)는 문자나 숫자 같은 값을 담는 컨테이너다. 여기에 담겨진 값은 다른 값으로 바꿀 수 있다. 변수는 마치 (사람이 쓰는 언어인) 자연어에서 대명사와 비슷한 역할을 한다.
변수의 선언
다음 예제는 변수에 값을 대입하는 방법을 보여주는 예제다.
/variable/variable1.php
https://github.com/egoing/phpeverybody/blob/master/variable/variable1.php
<html> <body> <?php $a=1; echo $a+1; #2 echo "<br />"; $a=2; print $a+1; #3 ?> </body> </html>
#은 주석(comment)으로 코드에 부가적인 설명을 쓰거나 사용하지 않는 코드를 비활성화시키기 위해서 사용한다. #뒤에 따라오는 내용은 해석되지 않는다. # 대신에 //를 사용할 수도 있다. 긴 구간을 주석으로 처리하고 싶다면 /* */를 사용한다.
위의 실습 결과는 각각 2와 3이 출력될 것이다. 변수 $a에 담겨 있는 값이 1일 때는 $a+1의 결과가 2가 된다. 두번째 결과가 3이 된 것은 $a의 값이 2로 바뀌었고, 2+1의 결과인 3이 출력된 것이다.
다음 예제는 변수의 값이 꼭 숫자만 올 수 있는 것은 아니라는 것을 보여주기 위해서 만든 예제다.
/variable/variable2.php
https://github.com/egoing/phpeverybody/blob/master/variable/variable2.php
<html> <body> <?php $first = "coding"; echo $first." everybody"; ?> </body> </html>
변수가 없다면
변수는 코드의 재활용성을 높여준다. 예를들어서 100에 10을 더하고, 10을 나눈 후에 다시 10을 빼고 거기에 10을 곱해야 한다고 치자. 그리고 각 단계마다 그 결과를 출력해야 한다면 코드는 아래와 같을 것이다.
/variable/variable3.php
https://github.com/egoing/phpeverybody/blob/master/variable/variable3.php
<html> <body> <?php echo 100+10; echo '<br />'; echo (100+10)/10; echo '<br />'; echo ((100+10)/10)-10; echo '<br />'; echo (((100+10)/10)-10)*10; echo '<br />'; ?> </body> </html>
그런데 계산해야 할 값을 100이 아니라 1000으로 바꿔야 한다면 위의 코드를 모두 수정해야 할 것이다. 변수를 적용해보자.
/variable/variable4.php
https://github.com/egoing/phpeverybody/blob/master/variable/variable4.php
<html> <body> <?php $a = 100; $a = $a + 10; print $a.'<br />'; $a = $a / 10; print $a.'<br />'; $a = $a - 10; print $a.'<br />'; $a = $a * 10 ; print $a.'<br />'; ?> </body> </html>
위의 코드에서 첫번째 줄의 100을 다른 숫자로 바꾸면 나머지 로직에 대입되는 변수의 값이 모두 바뀐다. 수정해야 할 코드가 적다는 것은 그만큼 해야 할 일이 줄어든다는 의미고, 그 과정에서 버그가 발생할 가능성을 낮출 수 있다. 변수의 효용은 뒤에서 배우게 될 반복문, 조건문, 함수와 결합되면 더욱 더 중요해진다.
상수
상수(常數, constant)는 변하지 않는 값이다. 예를들어 아래는 성립 될 수 없다.
1=2;
즉 정수 1은 2가 될 수 없기 때문에 상수이다. 필요에 따라서 사용자가 직접 상수를 정의 할 수도 있다. 아래 예제를 보자.
/variable/variable8.php
https://github.com/egoing/phpeverybody/blob/master/variable/variable8.php
<html> <body> <?php define('TITLE', 'PHP Tutorial'); echo TITLE; define('TITLE', 'JAVA Tutorial'); ?> </body> </html>
결과는 아래와 같다.
PHP Tutorial Notice: Constant TITLE already defined in C:\BitNami\wampstack-5.4.20-0\apache2\htdocs\variable\variable8.php on line 6
상수를 정의 할 때는 define를 사용한다. define의 첫번째 인자로 상수의 이름이 사용되고, 두번째 인자로 상수의 값이 사용된다. 상수에 저장된 값을 사용하기 위해서는 인용부호가 없이 상수의 이름을 적어주면 된다. 위의 예제는 PHP Tutorial를 출력 하지만 동시에 오류를 발생시킨다. 위의 코드는 한번 정의된 상수의 값은 불변이라는 원칙을 어기고 있기 때문에 PHP에서는 오류를 발생시킨 것이다. 상수는 한번 정의된 어떤 값이 변경되지 않음을 보증한다. 이러한 성질을 이용해서 설정 값과 같은 용도로 상수를 주로 사용한다.
변수에 담긴 데이터 형을 검사하고 변경하기
PHP에서 변수에 담긴 데이터 형을 검사할 때는 gettype과 settype을 사용한다. 아래는 이 명령들의 사용법이다.
/variable/variable5.php
https://github.com/egoing/phpeverybody/blob/master/variable/variable5.php
<html> <body> <?php $a = 100; echo gettype($a); settype($a, 'double'); echo '<br />'; echo gettype($a); ?> </body> </html>
위의 코드를 실행해보면 integer(정수)와 double(실수)가 출력된다. $a에 어떤 데이터형이 담겨있는지 알아보기 위해서 gettype을 사용했다. gettype은 인자로 전달된 값의 데이터 형을 출력한다. var_dump와 비슷 하지만 var_dump는 데이터형에 대한 검사와 함께 출력까지 강제로 하기 때문에 활용도가 떨어진다. settype은 첫번째 인자로 주어진 값을 두번째 인자에 해당하는 데이터 형으로 변경해준다.
이와 비슷한 역할을 하는 API로는 아래와 같은 것이 있다.
- is_ array
- is_ bool
- is_ callable
- is_ double
- is_ float
- is_ int
- is_ integer
- is_ long
- is_ null
- is_ numeric
- is_ object
- is_ real
- is_ resource
- is_ scalar
- is_ string
변수의 데이터 타입
PHP는 다른 언어들과는 다르게 변수에 담길 값의 데이터 형식을 미리 지정할 필요가 없다. 아래의 예제를 보자.
/variable/variable6.php
https://github.com/egoing/phpeverybody/blob/master/variable/variable6.php
<html> <body> <?php $a = 100; $a = "test"; $a = array(1,2,3); ?> </body> </html>
위의 코드는 PHP에서는 아무런 문제가 없다. 이것은 PHP의 장점이면서 단점으로 이야기 되기도 한다. 즉 변수 $a를 선언할 때 변수에 어떤 값이 들어가야 하는지 미리 지정 할 필요가 없다. 필요에 따라서 다른 형식의 데이터를 넣으면 변수의 데이터 형식이 자동으로 변경된다. 이것은 매우 편리 하지만, 변수에 어떠한 형식의 데이터가 담겨있는지를 예측할 수 없기 때문에 오류가 발생할 가능성이 높아지기도 한다.
가변변수
variable variables. 가변변수는 변수의 이름을 변수로 변경 할 수 있는 기능이다. 이것은 코드로 이해하는 것이 더욱 빠르다.
/variable/variable7.php
https://github.com/egoing/phpeverybody/blob/master/variable/variable7.php
<html> <body> <?php $title = 'subject'; $$title = 'PHP tutorial'; echo $subject; ?> </body> </html>
위의 코드를 보면 변수 $title의 값이 subject이다. 그런데 5행에 나타나는 '$$title'에는 '$'가 두번 표시되어 있다. 이것은 문자열 'PHP tutorial'이 변수 $title의 값이 아니라 변수 $subject의 값이라는 의미다. 변수의 이름을 동적으로 만들 수 있다는 점은 PHP가 가진 유연함을 보여준다.