php 변수 역할 영역의 깊이 있 는 해석

PHP 의 모든 변 수 는 그 역할 영역 을 가지 고 있 습 니 다.변 수 를 방문 할 수 있 는 영역 을 말 합 니 다.초보 자 에 게 변수의 역할 영역 은 그들 이 머 무 르 는 페이지 이다.따라서$var 를 정의 하면 페이지 의 나머지 부분 은$var 에 접근 할 수 있 습 니 다.그러나 다른 페이지 는 특별한 변 수 를 사용 하지 않 는 한 접근 할 수 없습니다.원본 스 크 립 트 의 일부분 처럼 파일 을 포함 하기 때문에 include()줄 이전에 정 의 된 변 수 는 파일 을 포함 하여 사용 할 수 있 습 니 다.또한,파일 에 정 의 된 변 수 를 포함 하여 include()줄 뒤의 부모(포함)스 크 립 트 를 사용 할 수 있 습 니 다.자신 이 정의 한 함 수 를 사용 할 때 모든 것 이 뚜렷 하지 않 습 니 다.이 함수 들 은 자신 들 의 역할 영역 을 가지 고 있 습 니 다.이것 은 한 함수 에서 사용 하 는 변 수 는 외부 에서 사용 할 수 없고 함수 외부 에서 정의 하 는 변 수 는 내부 에서 사용 할 수 없다 는 것 을 의미 합 니 다.이 때문에 함수 내부 의 변 수 는 외부 변수 와 같은 이름 을 가 질 수 있 지만 이들 은 여전히 완전히 다른 변수 이 고 서로 다른 값 을 가진다.대부분의 초급 프로그래머 들 에 게 이것 은 사람 을 헷 갈 리 게 하 는 개념 이다.함수 내 변수의 역할 영역 을 바 꾸 려 면 global 문 구 를 사용 할 수 있 습 니 다.

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--><?php
function function_name() {
    global $var;
}
$var=20;
function_name(); // Function call.
?>
이 예제 에서 함수 내부 의$var 는 현재 함수 외부$var 와 같 습 니 다.이 는 변수$var 가 하나의 값 20 을 가지 고 있 음 을 의미 합 니 다.함수 내부 에서 이 값 을 바 꾸 면 외부$var 값 도 변 합 니 다.변수 역할 영역 을 피 하 는 또 다른 방법 은 초 전역 변 수 를 이용 하 는 것 입 니 다:$GET、$_POST、$_REQUEST 등.이 변 수 는 함수 내 에서 자동 으로 접근 할 수 있 습 니 다(따라서 초 전역 변수 입 니 다).함수 에서 사용 할 수 있 도록$GLOBALS 배열 에 요 소 를 추가 할 수도 있 습 니 다.함수 내 에서 전역 변 수 를 사용 하지 않 는 것 이 좋다 는 것 이다.함 수 를 설계 할 때 필요 에 따라 모든 값 을 매개 변수 로 받 아들 이 고 필요 에 따라 모든 값 을 되 돌려 주어 야 합 니 다.함수 내의 전역 변수 에 의존 하면 상하 문 에 더욱 의존 하기 때문에 그다지 유용 하지 않다.PHP 에서 변 수 는 주로 슈퍼 전역 변수,일반적인 변수,상수,전역 변수,정적 변수 등 이 내장 되 어 있 습 니 다.슈퍼 전역 변 수 는 스 크 립 트 의 모든 곳 에서 사용 하고 볼 수 있 습 니 다.즉,만약 우리 가 하나의 PHP 페이지 에서 그 중의 한 값 을 바 꾸 었 다 면,다른 PHP 페이지 에서 사용 할 때,그 값 도 변 경 될 것 이다.상수 가 밝 혀 지면 전역 에서 볼 수 있 습 니 다.즉,함수 내외 에서 사용 할 수 있 지만 이것 은 한 페이지 에 만 제 한 됩 니 다(include 와 include 를 통 해 포함).once)포 함 된 PHP 스 크 립 트 이지 만 다른 페이지 에 서 는 사용 할 수 없습니다.스 크 립 트 에서 설명 하 는 전역 변 수 는 전체 스 크 립 트 에서 볼 수 있 지만 함수 내부 가 아 닙 니 다.함수 내부 의 변 수 는 전역 변수 이름과 같 으 면 함수 내부 변 수 를 기준 으로 합 니 다.함수 내부 에서 사용 하 는 변 수 를 전역 변수 로 설명 할 때 그 이름 은 전역 변수의 이름과 일치 해 야 합 니 다.이러한 상황 에서 우 리 는 함수 외부 전역 변 수 를 사용 할 수 있 습 니 다.그러면 함수 내부 의 변 수 는 외부 전역 변수 이름과 같 기 때문에 외부 변 수 를 덮어 쓰 는 것 을 피 할 수 있 습 니 다.함수 내부 에서 정적 변 수 를 만 들 고 설명 하 는 것 은 함수 외부 에서 볼 수 없 지만 함수 의 여러 번 실행 과정 에서 이 값 을 유지 할 수 있 습 니 다.가장 흔히 볼 수 있 는 상황 은 함수 의 재 귀 실행 과정 입 니 다.함수 내부 에 생 성 된 변 수 는 함수 에 있어 서 로 컬 이 고 함수 가 종 료 될 때 이 변 수 는 존재 하지 않 습 니 다.슈퍼 전역 변수의 전체 목록 은 다음 과 같 습 니 다.•.$GOBALS 모든 전역 변수 배열•.$SERVER 서버 환경 변수 배열•.$POST 이 스 크 립 트 에 POST 방법 으로 전 달 된 변수 배열•.$GET 는 GET 방법 을 통 해 이 스 크 립 트 에 전 달 된 변수 배열•.$COOKIE 쿠키 변수 배열•.$FILES 파일 업로드 와 관련 된 변수 배열•.$ENV 환경 변수 배열•.$REQUEST 모든 사용자 가 입력 한 변수 배열 은$를 포함 합 니 다.GET $_POST $_COOKIE 에 포 함 된 입력 내용•.$SESSION 세 션 변수 배열 인 스 턴 스 설명:

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--><?php
   $a = 4;
   function sendValue($x)
     {
        echo $x;
     }
    sendValue($a);
?>
설명:$a 는 함수 외 에 함수 가 인 자 를 정의 합 니 다.함수 가 호출 될 때$a 는 매개 변수 로 전 달 됩 니 다.따라서 위의 코드 는 정상적으로 작 동 할 수 있다.4567913)설명:함수 가 호출 될 때$a 는 매개 변수 로 전 달 될 수 없습니다.그래서 위의 코드 가 정상적으로 작 동 하지 않 습 니 다.변수 범위 변수의 범 위 는 바로 그 가 정의 하 는 상하 문 배경 이다.대부분의 PHP 변 수 는 하나의 단독 범위 만 있 습 니 다.이 단독 범위 범 위 는 include 와 require 가 도입 한 파일 을 포함 하고 있 습 니 다.범례:

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--><?php
    $a = 4;
    function sendValue()
     {
       echo $a;
    }
    sendValue();
?>
이 변 수 는$a 가 파일 b.inc 를 포함 하 는 데 적 용 됩 니 다.단,사용자 정의 함수 에서 부분 함수 범위 가 도 입 됩 니 다.함수 내부 에 사용 되 는 모든 변 수 는 부족 한 상황 에 따라 국부 함수 범위 내 에서 제 한 됩 니 다.범례:

<?php
  $a = 1;
  include "b.inc";
?>
이 스 크 립 트 는 출력 이 없습니다.echo 문 구 는 부분 버 전의 변 수 를 참조 하고 이 범위 내 에서 할당 되 지 않 았 기 때 문 입 니 다.PHP 의 전역 변수 와 C 언어 가 조금 다르다 는 것 을 알 수 있 습 니 다.C 언어 에서 전역 변 수 는 국부 변수 에 덮어 쓰 이지 않 는 한 함수 에서 자동 으로 적 용 됩 니 다.이것 은 일부 문 제 를 일 으 킬 수 있 고,어떤 사람들 은 전체 변 수 를 무심코 바 꿀 수도 있다.PHP 에서 전역 변 수 를 함수 에서 사용 할 때 전역 으로 표시 해 야 합 니 다.The global keyword 우선 global 을 사용 하 는 예:예 12-1.global

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--><?php
$a = 1; /* global scope */
function Test()
{
   echo $a; /* reference to local scope variable */
}
Test();
?>
이상 스 크 립 트 를 사용 하 는 출력 은'3'입 니 다.함수 에 전역 변수$a 와$b 를 밝 혔 습 니 다.모든 변수의 인용 변 수 는 전역 변 수 를 가리 킵 니 다.함수 가 설명 할 수 있 는 전역 변수의 최대 개수 에 대해 서 는 PHP 에 제한 이 없습니다.전역 적 으로 변수 에 접근 하 는 두 번 째 방법 은$GLOBALS 배열 을 특별한 PHP 로 정의 하 는 것 입 니 다.앞의 예 는 다음 과 같이 쓸 수 있 습 니 다.예 12-2.global

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--><?php
$a = 1;
$b = 2;
function Sum()
{
   global $a, $b;
   $b = $a + $b;
}
Sum();
echo $b;
?>
대신$GLOBALS 배열 에서 모든 변 수 는 하나의 요소 이 고,키 이름 은 대응 변수 이름,값 변수의 내용 입 니 다.$GLOBALS 가 전역 적 으로 존재 하 는 이 유 는$GLOBALS 가 초 전역 변수 이기 때 문 입 니 다.다음 범례 는 초 전역 변수의 용 도 를 보 여 줍 니 다.예 12-3.초 전역 변수 와 역할 도 메 인 을 보 여 주 는 예

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--><?php
$a = 1;
$b = 2;
function Sum()
{
   $GLOBALS["b"] = $GLOBALS["a"] + $GLOBALS["b"];
}
Sum();
echo $b;
?>
는 정적 변수 범 위 를 사용 하 는 또 다른 중요 한 특성 은 정적 변수(static variable)입 니 다.정적 변 수 는 국부 함수 역 에 만 존재 하지만 프로그램 이 이 역할 역 을 떠 날 때 그 값 을 잃 어 버 리 지 않 습 니 다.다음 의 예 를 보 세 요:예 12-4.정적 변 수 를 필요 로 하 는 예

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--><?php
function test_global()
{
   // "super", 'global' 。
   global $HTTP_POST_VARS;
   print $HTTP_POST_VARS['name'];
   // Superglobals , 'global' 。Superglobals PHP 4.1.0 。
   print $_POST['name'];
}
?>
를 보 여 줍 니 다.이 함 수 는 호출 할 때마다$a 의 값 을 0 으로 설정 하고'0'을 출력 하기 때 문 입 니 다.변 수 를 하나 로 추가 하 는$a++는 작용 하지 않 습 니 다.이 함 수 를 종료 하면 변 수 는$a 가 존재 하지 않 기 때 문 입 니 다.이번 계수 값 을 잃 어 버 리 지 않 는 계수 함 수 를 쓰 려 면 변수$a 를 정적 으로 정의 해 야 합 니 다.예 12-5.정적 변 수 를 사용 하 는 예

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--><?php
function Test ()
{
   $a = 0;
   echo $a;
   $a++;
}
?>
는 현재 Test()함 수 를 호출 할 때마다$a 의 값 을 출력 하고 추가 합 니 다.정적 변수 도 재 귀 함 수 를 처리 하 는 방법 을 제공 했다.재 귀 함 수 는 자신 을 호출 하 는 함수 이다.재 귀 함 수 를 쓸 때 는 무한 재 귀 할 수 있 으 므 로 조심해 야 한다.재 귀 를 중단 할 충분 한 방법 을 확보 해 야 한다.이 간단 한 함수 재 귀 계 수 를 10 까지 계산 하고 정적 변수$count 를 사용 하여 언제 멈 추 는 지 판단 합 니 다.예 12-6.정적 변수 와 재 귀 함수

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--><?php
function Test()
{
   static $a = 0;
   echo $a;
   $a++;
}
?>
주:정적 변 수 는 위의 예 에 따라 설명 할 수 있 습 니 다.성명 에서 표현 식 결 과 를 사용 하면 값 을 할당 하 는 데 오류 가 발생 할 수 있 습 니 다.예 12-7.정적 변수

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--><?php
function Test()
{
   static $count = 0;
   $count++;
   echo $count;
   if ($count < 10) {
   Test ();
   }
   $count--;
}
?>
의 전역 과 정적 변수의 인용 은 Zend 엔진 1 세대 에 있 고 PHP 4 를 구동 하 며 변수의 static 과 global 정 의 는 references 방식 으로 이 루어 집 니 다.예 를 들 어 한 함수 역 내부 에서 global 문장 으로 가 져 온 진정한 전역 변 수 는 실제 적 으로 전역 변수 에 대한 인용 을 만 들 었 다.이 는 예상 치 못 한 행 위 를 초래 할 수 있 습 니 다.예 를 들 어 다음 과 같은 예 를 들 어 보 여 줍 니 다.

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--><?php
function foo(){
   static $int = 0; // correct
   static $int = 1+2; // wrong (as it is an expression)
   static $int = sqrt(121); // wrong (as it is an expression too)
   $int++;
   echo $int;
}
?>
상기 예 를 실행 하면 다음 과 같은 출력 을 초래 할 수 있 습 니 다.

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--><?php
function test_global_ref() {
   global $obj;
   $obj = &new stdclass;
}
function test_global_noref() {
   global $obj;
   $obj = new stdclass;
}
test_global_ref();
var_dump($obj);
test_global_noref();
var_dump($obj);
?>
유사 한 행위 도 static 문장 에 적 용 됩 니 다.인용 은 정적 으로 저 장 된 것 이 아 닙 니 다.

NULLobject(stdClass)(0) {}
상기 예 를 실행 하면 다음 과 같은 출력 을 가 져 올 수 있 습 니 다.

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--><?php
function &get_instance_ref() {
   static $obj;
   echo "Static object: ";
   var_dump($obj);
   if (!isset($obj)) {
   //
   $obj = &new stdclass;
   }
   $obj->property++;
   return $obj;
}
function &get_instance_noref() {
   static $obj;
   echo "Static object: ";
   var_dump($obj);
   if (!isset($obj)) {
   //
   $obj = new stdclass;
   }
   $obj->property++;
   return $obj;
}
$obj1 = get_instance_ref();
$still_obj1 = get_instance_ref();
echo "
";
$obj2 = get_instance_noref();
$still_obj2 = get_instance_noref();
?>
상기 예 는 인용 을 정적 변수 에 할당 할 때 두 번 째 호출&get 을 보 여 주 었 습 니 다.instance_ref()함수 의 값 은 기억 되 지 않 습 니 다.

좋은 웹페이지 즐겨찾기