8. 장. 변수 (Variables)

차례
기본(Basics)
미리 정의된 변수 (Predefined variables)
변수 사용 범위 (Variable Scope)
가변 변수 (Variable variables)
PHP 밖에서 온 변수들 (Variables from outside PHP)

기본(Basics)

PHP에서 변수는 변수명앞에 달러표시($)를 붙여서 사용한다. 또한 변수명에 있어 대소문자도 구분한다.

변수명은 PHP내의 다른 라벨명을 정의하는 것과 동일한 규칙을 적용 받는다. 유효한 변수명은 문자나 혹은 밑줄(_)로 시작하여야 하고, 두번째 문자부터는 문자나 숫자,밑줄 등을 사용할수 있고 길이에는 제한이 없다. 정규식으로 표현하자면 다음과 같이 나타낼수 있다. : '[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'

참고: 여기서 문자란 a-z, A-Z 사이의 알파벳과 ASCII 코드 127부터 255까지(0x7f-0xff)를 의미한다

$var = "Bob"; $Var = "Joe"; echo "$var, $Var"; $4site = 'not yet'; // 변수명이 숫자로 시작했으므로 규칙에 위배된다 $_4site = 'not yet'; // 언더스코아로 시작된 변수는 사용할수 있다. $t_e = 'mansikka'; // '_는 ASCII 228번째 문자이므로 유효하다. 
$var = "Bob";
$Var = "Joe";
echo "$var, $Var";      // 결과값은 "Bob, Joe" 

$4site = 'not yet';      // 변수명이 숫자로 시작했으므로 규칙에 위배된다
$_4site = 'not yet';    // 밑줄로 시작된 변수는 사용할수 있다. 
$tae = 'mansikka';    // 'a는 ASCII 228번째 문자이므로 유효하다.

PHP 3 에서 변수는 항상 값을 가지고 있다. 다시말해서, 표현식의 값을 변수에 적용하면 표현식의 결과값이 변수로 복사된다. 표현식의 값을 변수에 복사하므로 복사되고 난 후에 발생한 표현식의 변화는 변수에 더이상 영향을 주지 않는다. 이에 대한 자세한 설명은 표현식(Expressions)을 참조하기 바란다.

PHP 4 에서는 변수에 값을 대입하는 다른 방법을 제공한다. : 참조를 사용한 값 대입 (assign by reference). 이는 새로운 변수가 값을 복사하여 가지고 오는 것이 아니라 원래 값이 있는 곳을 단순히 참조하는 방법이다. 원래 값이 있는 변수의 별칭이 된다라고 할수도 있고, 원래 변수를 가리킨다고 표현할 수도 있다. 새로운 변수값의 변화는 원래 변수의 값에 영향을 주고, 반대로 원래변수의 값이 변하여도 새로운 변수에 영향을 미친다. 값을 복사하는 것과는 전혀 다른 개념이라 할수 있다. 따라서 크기가 큰 배열이나 객체를 지정할 때나, 반복문을 수행하는데 있어 수행속도가 빨라진다.

참조(reference)를 사용한 대입을 하려면, 대입문에서 대입하려는 값을 가지고 있는 변수(source 변수)의 앞에 &를 붙여주면 된다. 예를들어, 다음의 예제 코드는 'My name is Bob'을 두번 출력한다.

<?php
$foo = 'Bob';              // Assign the value 'Bob' to $foo
$bar = &$foo;          // Reference $foo via $bar.
$bar = "My name is $bar";  // Alter $bar...
echo $foo;                 // $foo is altered too.
echo $bar;
?>

여기서 중요한 한가지는 이름을 가지고 있는 변수만이 참조를 사용한 대입이 가능하다는 것이다. 즉, 특정한 값에 &를 사용할 수 없다는 것이다.

<?php
$foo = 25;
$bar = &$foo;      // This is a valid assignment.
$bar = &(24 * 7);  // Invalid; references an unnamed expression.

function test() {
   return 25;
}

$bar = &test();    // Invalid.
?>