변수가 사용가능한 곳은 그 변수가 선언된 곳 안에서 만이다. PHP 변수의 대부분은 한 개의 범위(single scope)만을 가지고 있다. 이 범위는 include나 require되어서 읽혀온 파일에도 동일하게 적용된다. 예를들어 :
위에서 $a변수는 b.inc 스크립트에서도 사용할 수 있다. 기본적으로 함수 안에서 선언된 것은 함수 안에서만 사용되는 지역 변수이다. 또한 함수 안에서 사용되는 함수들은 기본적으로 지역 변수라고 가정하고 찾게 된다. 예를 들어:
$a = 1; /* global scope */ Function Test () { echo $a; /* reference to local scope variable */ } Test (); |
이 스크립트는 함수 안의 $a 변수를 지역변수로 가정하였고, 지역변수 $a에는 아무 값도 대입되지 않았기 때문에 아무런 출력도 나타나지 않는다. 이것은 C와는 약간 차이가 나는 부분이다. PHP에서 전역변수를 사용하려면 사용하고 싶은 전역 변수를 함수 안에 global 선언을 해 주어야 한다. 예를 들어 :
위의 스크립트는 "3"을 출력할 것이다. 함수 내에서 $a와 $b를 global로 선언했으므로, 이 함수내의 $a, $b는 전역 변수를 참조하게 된다. 함수 내에서 다룰 수 있는 전역변수의 개수에는 제한이 없다.
전역 변수를 참조하는 두 번째 방법은 PHP에서 특별히 정의하고 있는 $GLOBALS라는 배열을 사용하는 것이다. 위의 예를 다음과 같이 바꿔 쓸 수 있다. :
$GLOBALS 배열은 변수이름이 Key가 되고, 그 변수의 내용이 값이 되는 원소를 가진 associative 배열이다.
변수 범위와 관련하여 알아두어야 할 또 다른 내용으로 정적 변수(static variable)가 있다다. 정적 변수는 지역 함수 내에서만 존재하지만 지역 함수가 종료되어도 그 값을 읽어버리지 않고 가지고 있다. 다음 예를 보자 :
이 함수는 이 함수가 호출될 때마다 $a를 0으로 설정하고 "0"을 출력한다. 이 함수가 종료되는 시점에서 $a 변수가 사라지므로 증가 연산인 $a++는 무의미한 명령이 된다. 현재의 수를 잃지 않고 계속 세어나가는 카운팅 함수를 만들기 위해서는 다음과 같이 $a 변수를 정적으로 선언해야 한다.
이제 Test() 함수가 호출될 때 마다 $a의 값을 출력하고 그 값을 하나 증가 시킨다.
또한 정적 변수는 다음과 같이 recursion에서 반드시 필요하다. 재귀적인 함수는 자기 자신의 함수를 호출하는 것을 말한다. 재귀적인 함수를 사용할 때는 무한 루프에 빠질 수 있기 때문에 매우 주의를 요한다. 따라서 여러분은 재귀 호출을 끝내는 적절한 방법을 마련해 두어야 한다. 다음의 간단한 예제는 10번의 재귀적 호출을 한다. 정적 변수 $count를 사용하여 중단될 시기를 알 수 있다.