PHP에서 global과 $GLOBAL의 차이점 분석
대부분의 사람들은 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











PHP 로깅은 웹 애플리케이션을 모니터링하고 디버깅하고 중요한 이벤트, 오류 및 런타임 동작을 캡처하는 데 필수적입니다. 시스템 성능에 대한 귀중한 통찰력을 제공하고 문제를 식별하며 더 빠른 문제 해결을 지원합니다.

Laravel은 직관적 인 플래시 방법을 사용하여 임시 세션 데이터 처리를 단순화합니다. 응용 프로그램에 간단한 메시지, 경고 또는 알림을 표시하는 데 적합합니다. 데이터는 기본적으로 후속 요청에만 지속됩니다. $ 요청-

PHP 클라이언트 URL (CURL) 확장자는 개발자를위한 강력한 도구이며 원격 서버 및 REST API와의 원활한 상호 작용을 가능하게합니다. PHP CURL은 존경받는 다중 프로모토콜 파일 전송 라이브러리 인 Libcurl을 활용하여 효율적인 execu를 용이하게합니다.

Laravel은 간결한 HTTP 응답 시뮬레이션 구문을 제공하여 HTTP 상호 작용 테스트를 단순화합니다. 이 접근법은 테스트 시뮬레이션을보다 직관적으로 만들면서 코드 중복성을 크게 줄입니다. 기본 구현은 다양한 응답 유형 단축키를 제공합니다. Illuminate \ support \ Facades \ http를 사용하십시오. http :: 가짜 ([ 'google.com'=> 'Hello World', 'github.com'=> [ 'foo'=> 'bar'], 'forge.laravel.com'=>

고객의 가장 긴급한 문제에 실시간 인스턴트 솔루션을 제공하고 싶습니까? 라이브 채팅을 통해 고객과 실시간 대화를 나누고 문제를 즉시 해결할 수 있습니다. 그것은 당신이 당신의 관습에 더 빠른 서비스를 제공 할 수 있도록합니다.

Alipay PHP ...

기사는 PHP 5.3에 도입 된 PHP의 LSB (Late STATIC BING)에 대해 논의하여 정적 방법의 런타임 해상도가보다 유연한 상속을 요구할 수있게한다. LSB의 실제 응용 프로그램 및 잠재적 성능

이 기사에서는 프레임 워크에 사용자 정의 기능 추가, 아키텍처 이해, 확장 지점 식별 및 통합 및 디버깅을위한 모범 사례에 중점을 둡니다.
