>백엔드 개발 >PHP 튜토리얼 >PHP의 global 및 $GLOBALS[] 예제에 대한 자세한 설명

PHP의 global 및 $GLOBALS[] 예제에 대한 자세한 설명

零下一度
零下一度원래의
2017-06-29 13:59:181313검색

PHP의 전역 변수는 C 언어와 약간 다릅니다. C 언어에서는 전역 변수가 지역 변수에 의해 재정의되지 않는 한 자동으로 함수에 적용됩니다.

이로 인해 전역 변수가 부주의하게 변경될 수 있습니다. PHP의 전역 변수는 함수에서 사용될 때 전역으로 선언되어야 합니다(Global 키워드는 함수에서 정의될 때만 유용합니다).
1: Global의 기능은 전역 변수를 정의하는 것이지만 이 전역 변수는 전체 웹사이트에 적용되는 것이 아니라 현재 페이지(include 또는 require에 있는 모든 파일 포함)에 적용됩니다.

<?PHP 
$a=123; 
function aa() 
{


Global $a; //$a가 전역 변수로 정의되지 않은 경우 함수 본문은 함수 본문 외부에서 $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.php에 일부 변수($a)를 정의했고 다른 파일에서는 external 함수를 정의했습니다. 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가 작성 방법만 다를 뿐 동일한 줄 알았는데, 실제로 적용해 보니 둘 사이의 차이가 여전히 매우 컸습니다.
먼저 다음 예를 살펴보세요.

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

<?php // 例子2 function test() { global $a; unset($a); } $a = 1; test(); print $a; ?>

执行结果为: 

为什么会输出1呢?不是已经把$a给unset了吗?unset失灵了?php的bug? 
都不是,其实unset起作用了,是把test函数中的$a给unset掉了,可以在函数后面加入 
print $a; 
复制代码 
来测试!也就是说global产生了test函数外部$a的别名变量“$a”,为了和外面的$a区别,我把它成为--test->$a,那么例子1也这么命名的话,可得出下面的图: 
而test_globals执行过以后,看变量的变化: 
此时,看图,就能理解为什么例子1执行完以后,$var2是0,而$var3是5了! 
所以我们得出一个结论,在函数中global和$GLOBALS[]的区别在于: 
global在函数产生一个指向函数外部变量的别名变量,而不是真正的函数外部变量,一但改变了别名变量的指向地址,就会发生一些意料不到情况(为什么会打印结果为2呢?其实就是因为$var1的引用指向了$var2的引用地址。导致实质的值没有改变。这时候只是指向$var1的指针指向了$var2的指针,只是指针指向变了一下,但是实质上根本就没有改变$var2的值,因此$var2的值仍旧不会变化),例如例子1. 
$GLOBALS[]确确实实调用是外部的变量,函数内外会始终保持一致! 
注:(接着回到上面的例子1,看test_global中的这一代码“$var2 =& $var1;”,上面是一个引用赋值运算,也就是$var2将指向var1所指向的物理内存地址,所以例子1执行过test_global函数以后,变量的变化只在函数的局部产生效应,在函数外部$var2的指向物理内存地址并没有变化,还是它自己.(重点) 
接着回到上面的例子1,看test_global中的这一代码“$var2 =& $var1;”,上面是一个引用赋值运算,也就是$var2将指向var1所指向的物理内存地址,所以例子1执行过test_global函数以后,变量的变化由下图可以看出) 

위 내용은 PHP의 global 및 $GLOBALS[] 예제에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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