이 예에서 함수 내부의 $var는 이제 함수와 동일 외부 $var와 동일. 즉, $var 변수에는 이미 20이라는 값이 있고, 이 값이 함수 내부에서 변경되면 외부의 $var 값도 변경된다는 의미입니다. 변수 범위를 피하는 또 다른 방법은 슈퍼전역 변수($_GET, $_POST, $_REQUEST 등)를 사용하는 것입니다. 이러한 변수는 함수 내에서 자동으로 액세스할 수 있습니다(따라서 슈퍼전역 변수입니다). 함수 내에서 사용할 수 있도록 $GLOBALS 배열에 요소를 추가할 수도 있습니다. 함수 내에서는 전역 변수를 사용하지 않는 것이 가장 좋습니다. 함수를 설계할 때 필요에 따라 모든 값을 매개변수로 받아들이고 필요에 따라 값을 반환하도록 해야 합니다. 함수 내에서 전역 변수에 의존하면 함수가 상황에 더 의존하게 되어 유용성이 떨어집니다. PHP의 변수에는 주로 내장된 슈퍼 전역 변수, 일반 변수, 상수, 전역 변수, 정적 변수 등이 포함됩니다. 내장된 슈퍼 전역 변수는 스크립트의 어느 곳에서나 사용하고 볼 수 있습니다. 즉, PHP 페이지의 값 중 하나를 변경하면 다른 PHP 페이지에서 사용될 때 해당 값도 변경됩니다. 일단 선언되면 상수는 전역적으로 표시됩니다. 즉, 함수 내부 및 외부에서 사용할 수 있지만 이는 한 페이지에 포함된 PHP 스크립트(include 및 include_once를 통해 포함하는 PHP 스크립트 포함)로만 제한됩니다. 다른 페이지에서는 더 이상 사용할 수 없습니다. 스크립트에 선언된 전역 변수는 스크립트 전체에서 볼 수 있지만 함수 내부에서는 볼 수 없습니다. 함수 내부 변수의 이름이 전역 변수와 동일한 경우 함수 내부 변수가 우선합니다. 함수 내부에서 사용되는 변수를 전역 변수로 선언할 때 그 이름은 전역 변수의 이름과 일치해야 합니다. 이 경우 함수 외부에서 전역 변수를 사용할 수 있으므로 함수 내부의 변수 이름이 외부 전역 변수와 동일하기 때문에 외부 변수를 덮어쓰는 상황을 피할 수 있습니다. 함수 내부에서 정적으로 생성되고 선언된 변수는 함수 외부에서 볼 수 없지만 함수를 여러 번 실행하는 동안 값이 유지될 수 있습니다. 가장 일반적인 상황은 함수를 재귀적으로 실행하는 동안입니다. 함수 내부에 생성된 변수는 함수에 대해 로컬이며 함수가 종료되면 더 이상 존재하지 않습니다. 슈퍼 전역 변수의 전체 목록은 다음과 같습니다.
설명: $a는 외부에서 정의됩니다. function 에서는 함수가 매개변수를 정의하고, 함수가 호출되면 $a 가 매개변수 형태로 전달됩니다. 따라서 위의 코드는 정상적으로 실행될 수 있습니다.
설명: 함수가 호출되면 $a는 매개변수는 양식으로 전달됩니다. 따라서 위의 코드는 정상적으로 실행될 수 없습니다. 가변 범위 변수의 범위는 변수가 정의된 컨텍스트입니다(번역자: 직설적으로 말하면 유효 범위). 대부분의 PHP 변수에는 단일 범위만 있습니다. 이 단일 범위 범위에는 include 및 require에 의해 도입된 파일도 포함됩니다. 예:
여기서 $a 변수는 포함된 파일 b.inc에 적용됩니다. 그러나 사용자 정의 함수에는 로컬 함수 범위가 도입됩니다. 함수 내에서 사용되는 모든 변수는 기본적으로 로컬 함수 범위로 제한됩니다. 예:
echo 문이 변수 $a의 로컬 버전을 참조하고 이 범위 내의 값이 할당되지 않았기 때문에 이 스크립트는 출력을 생성하지 않습니다. PHP의 전역 변수는 C와 약간 다르다는 것을 알 수 있습니다. C에서 전역 변수는 지역 변수에 의해 재정의되지 않는 한 자동으로 함수에 적용됩니다. 누군가가 부주의하게 전역 변수를 변경할 수 있으므로 문제가 발생할 수 있습니다. PHP의 전역 변수는 함수에서 사용될 때 전역으로 선언되어야 합니다. 글로벌 키워드 먼저 전역 사용 예: 예제 12-1. 글로벌 사용
위 스크립트의 출력은 "3"이 됩니다. 전역 변수 $a 및 $b는 함수에서 선언되며 모든 변수의 모든 참조 변수는 전역 변수를 가리킵니다. PHP는 함수가 선언할 수 있는 전역 변수의 최대 개수에 제한이 없습니다. 전역 범위의 변수에 액세스하는 두 번째 방법은 특별한 PHP 사용자 정의 $GLOBALS 배열을 사용하는 것입니다. 이전 예는 다음과 같이 작성할 수 있습니다. 예제 12-2. global 대신 $GLOBALS 사용
$GLOBALS 배열에서 각 변수는 요소이고 키 이름은 변수 이름에 해당하며 값은 변수 내용에 해당합니다. $GLOBALS는 슈퍼전역 변수이기 때문에 $GLOBALS는 전역 범위에 존재합니다. 다음 예에서는 슈퍼전역 변수의 사용을 보여줍니다. 예제 12-3. 슈퍼전역 변수와 범위를 보여주는 예
정적 변수 사용 변수 범위의 또 다른 중요한 기능은 정적 변수입니다. 정적 변수는 로컬 함수 범위에만 존재하지만 프로그램 실행이 이 범위를 벗어나도 해당 값은 손실되지 않습니다. 아래 예를 살펴보세요. 예제 12-4는 정적 변수의 필요성을 보여줍니다.
$는 매번 변경되므로 이 기능은 쓸모가 없습니다. a의 값을 0으로 설정하고 "0"을 출력한다고 합니다. 함수가 종료되면 변수 $a가 더 이상 존재하지 않기 때문에 변수 $a를 1씩 늘려도 아무런 효과가 없습니다. 현재 카운트 값을 잃지 않는 카운팅 함수를 작성하려면 $a 변수를 static으로 정의하세요. 예제 12-5. 정적 변수 사용 예
이제 Test() 함수가 호출될 때마다, $는 a의 값을 출력하고 1을 더합니다. 1 2 다음 페이지 마지막 페이지 |