대부분의 사람들은 global과 $GLOBALS[]는 작성 방식만 다를 뿐이라고 생각하는데, 실제로는 그렇지 않습니다.
공식 설명에 따르면
$GLOBALS['var']는 외부 전역 변수 $var 그 자체입니다.
global $var는 외부 $var에 대한 동일한 이름의 참조 또는 포인터입니다. (오류: 포인터가 아닌 별칭 참조입니다!!!)
예:
php $GAOBAL[] 사용법:
01 <?php 02 $var1 = 1; 03 $var2 = 2; 04 function test() { 05 $GLOBALS['var2'] = &$GLOBALS['var1']; 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 = 'qianyunlai.com'; 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['var1']); 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['var1']; //输出1 06 //############################################ 07 $GLOBALS["var1"] = 1; 08 $var = &$GLOBALS["var1"]; 09 unset($GLOBALS['var1']); 10 echo $var; //输出1 11 //############################################ 12 //如果写成如下,则会出错 13 $GLOBALS["var"] = 1; 14 $var = &$GLOBALS["var"]; 15 unset($GLOBALS['var']); 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 '$var2'\n"; // var2 is set to '' 16 global_references(true); 17 echo "var2 is set to '$var2'\n"; // var2 is set to 'Example variable' 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에서 global과 $GLOBAL의 차이점 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!