>  기사  >  백엔드 개발  >  PHP에서 global과 $GLOBALS[]의 차이점은 무엇입니까?

PHP에서 global과 $GLOBALS[]의 차이점은 무엇입니까?

伊谢尔伦
伊谢尔伦원래의
2017-06-21 17:34:032365검색

1: Global의 기능은 전역 변수를 정의하는 것이지만 이 전역 변수는 전체 웹 사이트에 적용되는 것이 아니라 현재 페이지(include 또는 require에 있는 모든 파일 포함)에 적용됩니다.

<?php 
$a=123; 
function aa() 
{ 
Global $a; //如果不把$a定义为global变量,函数体内是不能访问函数体外部的$a的,但是可以定义一个相同的名字$a,此时这个变量是局部变量,等同于C语言的局部变量,只能在函数体内部使用。 
echo $a; 
} 
aa(); 
?>

요약: 함수 본문 내부에 정의된 전역 변수는 함수 본문 외부에서 사용할 수 있지만, 함수 본문 외부에 정의된 전역 변수는 함수 본문 내부에서 사용할 수 없습니다.

$global $a; 
$a=123; 
function f() 
{ 
echo $a; //错误, 
} 
//再看看下面一例 
function f() 
{ 
global $a; 
$a=123; 
} 
f(); 
echo $a; //正确,可以使用

2: 전역 문제 분석:
질문: 저는 config.inc에 있습니다. 일부 변수($a)는 .php에 정의되어 있습니다. 다른 파일에서는 함수 외부 include("config.inc.php")가 함수 내부에서 이러한 변수 $a를 사용해야 합니다. 선언하면 echo $a 아무것도 출력되지 않습니다. 따라서 전역 $a를 선언하지만 함수도 많고 변수도 많아 이렇게 반복해서 선언할 수는 없겠죠? 좋은 해결책이 있다면 조언 부탁드립니다.
답변1: 먼저 config.inc.php에서 상수를 정의하세요: 정의(상수 이름, 상수 값)
그런 다음 사용해야 하는 다른 위치에 'config.inc.php'를 요구합니다.
그런 다음 다음에서 직접 사용할 수 있습니다. 이 파일은 상수입니다.
답변2: $x[a], $x와 같은 배열을 정의하여 전역 $x만 선언하면 되는 방법도 있습니다.
답변3: 말씀하신 방법을 시도해 보았지만 효과가 없었습니다.
답변4: php.ini 파일을 변경하세요.
3. Global 및 $GLOBALS 배열의 몇 가지 예
예: 전역

<?php 
$w3sky = 1; 
$w3sky2 = 2; 
function Sum() 
{ 
global $w3sky, $w3sky2;$w3sky2 = $w3sky + $w3sky2; 
}Sum(); 
echo $w3sky2; 
?>
사용

위 스크립트의 출력은 "3"입니다. 전역 변수 $w3sky 및 $w3sky2는 함수에서 선언되며 모든 변수의 모든 참조 변수는 전역 변수를 가리킵니다. PHP는 함수가 선언할 수 있는 전역 변수의 최대 개수에 제한이 없습니다.
전역 범위의 변수에 액세스하는 두 번째 방법은 특별한 PHP 사용자 정의 $GLOBALS 배열을 사용하는 것입니다. 이전 예는 다음과 같이 작성할 수 있습니다.
예제 전역 대신 $GLOBALS 사용

<?PHP 
$w3sky = 1; 
$w3sky2 = 2;function Sum() 
{ 
$GLOBALS[&#39;w3sky&#39;] = $GLOBALS[&#39;w3sky&#39;] + $GLOBALS[&#39;w3sky2&#39;]; 
}Sum(); 
echo $w3sky2; 
?>

$GLOBALS 배열에서 각 변수는 요소이고 키 이름은 변수 이름에 해당하며 값은 변수. $GLOBALS는 수퍼글로벌 변수이기 때문에 $GLOBALS는 전역 범위에 존재합니다. 다음 예는 슈퍼 전역 변수의 사용을 보여줍니다.
슈퍼 전역 변수 및 범위의 예를 보여주는 예

<?PHP 
function test_global() 
{ 
// 大多数的
预定义变量
并不 "super",它们需要用 &#39;global&#39; 关键字来使它们在函数的本地区域中有效。 
global $HTTP_POST_VARS;echo $HTTP_POST_VARS[&#39;name&#39;];// Superglobals 在任何范围内都有效,它们并不需要 &#39;global&#39; 声明。Superglobals 是在 PHP 4.1.0 引入的。 
echo $_POST[&#39;name&#39;]; 
} 
?>

global 즉, 파일에서 전역 $db로 선언하기만 하면 이 $를 파일 아래에서 참조할 수 있습니다. 선언 DB.
4. 처음에는 global과 $GLOBALS가 작성 방법만 다를 뿐 동일한 줄 알았는데, 실제로 적용해 보니 둘 사이의 차이가 여전히 매우 컸습니다.
먼저 다음 예를 살펴보세요.

실행 결과는 다음과 같습니다.


<?php 
// 例子1 
function test_global() { 
global $var1, $var2; 
$var2 =& $var1; 
} 
function test_globals() { 
$GLOBALS[&#39;var3&#39;] =& $GLOBALS[&#39;var1&#39;]; 
} 
$var1 = 5; 
$var2 = $var3 = 0; 
test_global(); 
print $var2 ."\n"; 
test_globals(); 
print $var3 ."\n"; 
?>

어떻게 이런 일이 일어날 수 있지? 5가 2개여야 하지 않겠습니까? 어떻게 1 0과 1 5가 있을 수 있을까요?

그럼 위의 질문을 유지하면서 $GLOBALS와 글로벌의 원리를 분석해 보겠습니다.
우리 모두는 변수를 알고 있습니다. 실제로는 코드에서 해당하는 물리적 메모리의 "코드명"입니다. 위에서 선언한 세 가지 변수에 의해 할당된 메모리가 아래 그림과 같다고 가정합니다.
php manual
의 $GLOBALS: 전역 변수: $GLOBALS 참고: $ GLOBALS는 PHP 3.0.0 이상 버전에서 사용할 수 있습니다.
정의된 모든 전역 변수로 구성된 배열. 변수 이름은 배열에 대한 인덱스입니다.
이것은 "수퍼글로벌"이거나 자동 전역 변수로 설명될 수 있습니다.
즉, 위 코드에서 $var1과 $GLOBALS['var1']은 2개의 다른 변수가 아닌 동일한 변수를 참조합니다!
글로벌이 어떤 일을 했는지 분석해볼까요?
우리 모두는 PHP에서 함수에 의해 생성된 변수가 함수의 비공개 변수라는 것을 알고 있으므로 전역 키워드에 의해 생성된 변수는 확실히 이 규칙을 벗어날 수 없습니다. 다음 코드를 살펴보세요. 결과는 1입니다.
왜 1이 출력되나요? $a가 설정 해제되지 않았나요? 설정 해제에 실패했나요? PHP 버그?
아니요, 사실 unset은 작동합니다. 테스트 함수에서 $a를 설정 해제합니다.

print $a를 추가하여 테스트할 수 있습니다. 즉, global은 test 함수 외부에 $a의 별칭 변수 "$a"를 생성하고, test_globals가 실행된 후 변수의 변화를 살펴봅니다.

이 시점에서 예제 1이 실행된 후 $var2가 0이고 $var3이 5인 이유를 이해할 수 있습니다!
그래서 함수에서 global과 $GLOBALS[]의 차이점은 다음과 같습니다.
global은 함수의 실제 외부 변수 대신 함수의 외부 변수를 가리키는 별칭 변수를 생성합니다. . 별칭 변수가 변경되면 주소를 가리키면 예상치 못한 상황이 발생합니다(왜 인쇄 결과가 2입니까? 실제로는 $var1의 참조가 $var2의 참조 주소를 가리키기 때문입니다. 결과적으로) , 실제 값은 변경되지 않았습니다. 이때는 $var1에 대한 포인터일 뿐입니다. $var2를 가리키는 포인터는 포인터 포인터만 변경하지만 실제로는 $var2의 값이 전혀 변경되지 않습니다. $var2는 여전히 변경되지 않습니다)(예: 예 1).
$GLOBALS[]는 실제로 호출됩니다. 이는 외부 변수이며 함수 내부와 외부에서 항상 일관성을 유지합니다!


위 내용은 PHP에서 global과 $GLOBALS[]의 차이점은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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