>  기사  >  백엔드 개발  >  PHP에서 global과 $GLOBAL의 차이점 분석

PHP에서 global과 $GLOBAL의 차이점 분석

不言
不言원래의
2018-07-18 11:48:474187검색

대부분의 사람들은 global과 $GLOBALS[]는 작성 방식만 다를 뿐이라고 생각하는데, 실제로는 그렇지 않습니다.

공식 설명에 따르면

$GLOBALS['var']는 외부 전역 변수 $var 그 자체입니다.

global $var는 외부 $var에 대한 동일한 이름의 참조 또는 포인터입니다. (오류: 포인터가 아닌 별칭 참조입니다!!!)

예:

php $GAOBAL[] 사용법:

01    <?php    
02    $var1 = 1;    
03    $var2 = 2;    
04    function test() {    
05        $GLOBALS[&#39;var2&#39;] = &$GLOBALS[&#39;var1&#39;];    
06    }    
07    
08    test();    
09    echo $var2;    
10    ?>

일반 인쇄 결과는 1

php 전역 사용법:

01    <?php    
02    $var1 = 1;    
03    $var2 = 2;    
04    
05    function test(){    
06        global $var1, $var2;    
07        $var2 = &$var1;    
08        echo $var2;    
09        $var2 = &#39;qianyunlai.com&#39;;    
10    }    
11    
12    test(); // 输出 1    
13    echo $var2; // 输出 2    
14    echo $var1; // 输出 qianyunlai.com    
15    ?>

test( ) $ 함수의 var1 및 $va2는 모두 지역 변수입니다. 그러나 전역 키워드를 추가한 후에는 각각 전역 변수 $var1 및 $va2를 참조합니다. $var2 = &$var1;이면 지역 변수 $var2는 더 이상 참조되지 않습니다. 전역 변수 $val2를 가리키지만 전역 변수 $var1로 리디렉션됩니다. 즉, 지역 변수 $var2에 대한 변경 사항은 더 이상 전역 변수 $val2에 영향을 미치지 않지만 리디렉션된 전역 변수 $val1에는 영향을 미칩니다.

또 다른 예를 살펴보겠습니다.

1    <?php    
2    $var1 = 1;    
3    function test(){    
4        unset($GLOBALS[&#39;var1&#39;]);    
5    }    
6    test();    
7    echo $var1;    
8    ?>

$var1이 삭제되었기 때문에 아무것도 인쇄되지 않았습니다.

01    <?php    
02    $var1 = 1;    
03    
04    function test(){    
05        global $var1;    
06        unset($var1);    
07    }    
08    
09    test();    
10    echo $var1;    
11    ?>

실수로 1을 인쇄했습니다.

$GLOBALS['var']의 별칭과 참조만 삭제되고 값 자체는 전혀 변경되지 않았음을 증명합니다.

이해하셨나요?

즉, 전역 $var는 실제로 $var = &$GLOBALS['var']입니다. 외부 변수를 호출하기 위한 별칭일 뿐입니다.

Global과 $GLOBALS는 PHP에서 다르게 작성되었을 뿐만 아니라 둘 사이의 차이가 여전히 매우 크기 때문에 실제 응용 프로그램에서는 주의해야 합니다!

먼저 다음 예를 살펴보세요.

1    <?php    
2    $id = 1;    
3    function test() {    
4        global $id;    
5        unset($id);    
6    }    
7    test();    
8    echo($id); // 输出 1    
9    ?>

참조 위치 지정

많은 PHP 구문 구조가 참조 메커니즘을 통해 구현되므로 참조 바인딩에 대한 위의 모든 내용이 이러한 구조에도 적용됩니다. 참조에 의한 전달 및 참조에 의한 반환과 같은 일부 구성은 위에서 이미 언급되었습니다. 참조를 사용하는 다른 구조는 다음과 같습니다.

global $var를 사용하여 변수를 선언하면 실제로 전역 변수에 대한 참조가 생성됩니다. 이는 다음을 수행하는 것과 같습니다:

01    <?php    
02    $GLOBALS["var1"] = 1;    
03    $var = &$GLOBALS["var1"];    
04    unset($var);    
05    echo $GLOBALS[&#39;var1&#39;]; //输出1    
06    //############################################    
07    $GLOBALS["var1"] = 1;    
08    $var = &$GLOBALS["var1"];    
09    unset($GLOBALS[&#39;var1&#39;]);    
10    echo $var; //输出1    
11    //############################################    
12    //如果写成如下,则会出错    
13    $GLOBALS["var"] = 1;    
14    $var = &$GLOBALS["var"];    
15    unset($GLOBALS[&#39;var&#39;]);    
16    echo $var; //脚本没法执行    
17    //###########################################    
18    ?>

이는 예를 들어 unset $var가 전역 변수를 설정 해제하지 않는다는 것을 의미합니다.

unset은 변수 이름과 변수 내용 사이의 바인딩을 끊습니다. 이는 변수 내용이 삭제된다는 의미는 아닙니다.

isset($var) 사용 시 false를 반환합니다. $this 개체의 메서드에서 $this는 항상 이를 호출하는 개체에 대한 참조입니다.

함수 내에서 전역으로 선언된 변수에 참조가 할당되면 해당 참조는 함수 내에서만 표시됩니다.

$GLOBALS 배열을 사용하면 이 문제를 피할 수 있습니다.

함수 내에서 전역 변수를 참조하는 예:

01    <?php    
02    $var1 = "Example variable";    
03    $var2 = "";    
04    
05    function global_references($use_globals) {    
06        global $var1, $var2;    
07        if (!$use_globals) {    
08            $var2 = &$var1; // visible only inside the function    
09        } else {    
10            $GLOBALS["var2"] = &$var1; // visible also in global context    
11        }    
12    }    
13    
14    global_references(false);    
15    echo "var2 is set to &#39;$var2&#39;\n"; // var2 is set to &#39;&#39;    
16    global_references(true);    
17    echo "var2 is set to &#39;$var2&#39;\n"; // var2 is set to &#39;Example variable&#39;    
18    ?>

전역 $var;을 $var = &$GLOBALS['var'];의 약어로 취급합니다. 따라서 $var에 다른 참조를 할당하면 로컬 변수에 대한 참조만 변경됩니다.

앞서 언급했듯이 참조는 포인터가 아닙니다. 이는 다음 구성이 예상한 효과를 갖지 않음을 의미합니다.

1    <?php    
2    $bar = 3;    
3    function foo(&$var) {    
4        $GLOBALS["baz"] = 5;    
5        $var = &$GLOBALS["baz"];    
6    }    
7    foo($bar);    
8    echo $bar;//输出3    
9    ?>

이렇게 하면 foo 함수의 $var 변수가 함수 호출 시 $bar에 바인딩되지만 $GLOBALS[" baz에 다시 바인딩됩니다. "] 위에.

함수 foo에는 $bar 변수가 없기 때문에 참조 메커니즘을 통해 $bar를 함수 호출 범위의 다른 변수에 바인딩하는 것은 불가능합니다($var로 표시되지만 $var에는 변수 내용만 있고 변수 내용은 없습니다. 기호 테이블에서 이름-값 바인딩을 호출합니다. 함수에 의해 선택된 참조 변수에 대한 참조 반환을 사용할 수 있습니다.

PHP 매뉴얼의 $GLOBALS 설명 인용:

전역 변수: $GLOBALS, 참고: $GLOBALS는 PHP 3.0.0 이상 버전에서 적용 가능합니다.

정의된 모든 전역 변수로 구성된 배열입니다. 변수 이름은 배열에 대한 인덱스입니다. 이는 "수퍼글로벌"이거나 자동 전역 변수로 설명될 수 있습니다.

즉, 위 코드의 $var1과 $GLOBALS['var1']은 2개의 다른 변수가 아닌 동일한 변수를 참조합니다!

함수 내에서 전역으로 선언된 변수에 참조가 할당되면 해당 참조는 함수 내에서만 표시됩니다. $GLOBALS 배열을 사용하면 이 문제를 피할 수 있습니다.

우리 모두는 PHP에서 함수에 의해 생성된 변수가 함수의 전용 변수라는 것을 알고 있으므로 global 키워드에 의해 생성된 변수는 확실히 이 규칙을 벗어날 수 없습니다. global은 함수의 외부 변수를 가리키는 별칭 변수를 생성합니다. 실제 함수 외부 변수 대신 별칭 변수의 지정 주소가 변경되면 $GLOBALS[]는 실제로 외부 변수라고 하며 함수 내부와 외부에서 항상 일관성을 유지합니다.

01    <?php    
02    $a = 1;    
03    $b = 2;    
04    function Sum() {    
05        global $a, $b;    
06        $b = $a + $b;    
07    }    
08    Sum();    
09    echo $b;    
10    ?>

출력은 "3"이 됩니다. 전역 변수 $a 및 $b는 함수에서 선언되며 모든 변수의 모든 참조 변수는 전역 변수를 가리킵니다.

왜 2가 아닌가? 함수 외부에서는 $b가 참조로 수정되지 않지만 수정된 $b는 물리 메모리의 값을 가리키므로 외부 입력이 된다는 점에 유의하시기 바랍니다. 3입니다.

관련 권장 사항:

PHP 전역 및 $GLOBALS 변수 범위 및 차이점

위 내용은 PHP에서 global과 $GLOBAL의 차이점 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.