php教程 php手册 PHP Global与$GLOBALS变量作用域与区别

PHP Global与$GLOBALS变量作用域与区别

May 25, 2016 pm 04:48 PM
global 변하기 쉬운

在php中变量有很多种如普通的变量及全局变量(Global与$GLOBALS),本文章来给大家介绍在php中Global与$GLOBALS的用法区别.

Global,全局变量

PHP Global变量在实际应用中会发现许多问题需要我们不断的去完善处理.我们在这篇文章中就针对PHP Global变量出现的问题给出了一些具体的解决办法,PHP hack的使用技巧详解,代码实现PHP GTK写文本查看器,网站开发中PHP语言优缺点.

如何正确实现PHP function函数扩展

PHP error_log()函数处理错误日志

1:PHP Global变量的作用是定义全局变量,但是这个全局变量不是应用于整个网站,而是应用于当前页面,包括include或require的所有文件

实例代码如下:

$a=123;
function aa()  
{  
    Global $a;   
    //如果不把$a定义为global变量,函数体内是不能访问$a的  
    echo $a;  
}  
aa();
로그인 후 복사

总结:

在函数体内定义的PHP Global变量,函数体外可以使用,在函数体外定义的global变量不能在函数体内使用,

实例代码如下:

$glpbal $a;   
$a=123;    
function f()   
{   
    echo $a; //错误,   
}
로그인 후 복사

再看看下面一例,实例代码如下:

function f()   
{   
    global $a;  $a=123;   
}    
f();   
echo $a;
//正确,可以使用
로그인 후 복사

2:PHP Global变量问题解析:

question:我在config.inc.php中定义了一些变量($a),在别的文件中函数外部 include("config.inc.php"),函数内部需要使用这些变量$a,如果没有声明的话,echo $a是打印不出来任何东西的.因此声明global $a,但是有很多函数和很多变量.总不能不断重复的这样声明吧?有什么好的解决办法,请指点.

answer1:先在config.inc.php里定义常量:define(常量名,常量值),再在其他需要用到的地方require 'config.inc.php',然后就能在这个文件里直接使用这个常量了.

answer2:我也有个办法,就是定义数组,如$x[a],$x,那样就只要声明global $x一个了.

answer3:我试了你的这个方法,不行啊.

answer4:改你的php.ini文件.

设置PHP Global变量 为 on,下面我们看看复杂点的:

实例代码如下:

//A.php 文件
<?php
function Test_Global() {
    include &#39;B.php&#39;;
    Test();
}
$a = 0;
Test_Global();
echo $a;
?>
로그인 후 복사
//B.php 文件 
<?php
function Test() {
    global $a; //申明函数体Sum内使用的$a变量为global全局变量
    $a = 1;
}
?>
로그인 후 복사

为什么输出的却是0?!!

在用户自定义函数中,一个局部函数范围将被引入.任何用于函数内部的变量按缺省情况将被限制在局部函数范围内(包括include 和 require 导入的文件内的变量)!

解释:A.php文件的内Test_Global是定义好的第三方函数,该函数用include导入了B.php文件内的$a的global全局变量,所以$a被限制在Test_Global局部函数范围内,所以B.php文件内的$a的作用范围都在Test_Global内,而不是作用了整个A.php内….

解决方案:

1. 冲出局部函数实例代码如下:

//A.php 文件 
<?php
function Test_Global() {
    Test();
}
include &#39;B.php&#39;; //将include 从局部Test_Global函数中移出
$a = 0;
Test_Global();
echo $a;
?>
로그인 후 복사
//B.php 文件 
<?php
function Test() {
    global $a;
    $a = 1;
}
?>
로그인 후 복사

global和$GLOBALS的区别

php中global和$GLOBALS不仅仅是写法不一样以为,2者的区别还是很大的,在实际应用中需要注意!

先看下面的实例代码:

<?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";
?>
로그인 후 복사
로그인 후 복사

执行结果为:0 5

怎么会这样呢?不应该是2个5吗?怎么会出现1个0和1个5呢?

恩,我们保留以上问题,深入分析$GLOBALS和global的原理!我们都知道变量其实是相应物理内存在代码中的"代号"而已引用php手册的$GLOBALS的解释:

Global 变量:$GLOBALS,注意: $GLOBALS 在 PHP 3.0.0 及以后版本中适用.由所有已定义全局变量组成的数组.变量名就是该数组的索引.这是一个"superglobal",或者可以描述为自动全局变量.也就是说上面代码中的$var1和$GLOBALS['var1']是指的同一变量,而不是2个不同的变量!下面来分析global到底做了什么?

引用php手册的global的解释:

如果在一个函数内部给一个声明为 global 的变量赋于一个引用,该引用只在函数内部可见.可以通过使用 $GLOBALS 数组避免这一点.我们都知道php中的函数所产生的变量都是函数的私有变量,那么global关键字产生的变量也肯定逃不出这个规则,为什么这么说呢,

请看下面的代码:

<?php
// 例子2
function test() {
    global $a;
    unset($a);
}
$a = 1;
test();
print $a;
?>
로그인 후 복사
로그인 후 복사

执行结果为:1

为什么会输出1呢?不是已经把$a给unset了吗?unset失灵了?php的bug?

都不是,其实unset起作用了,是把test函数中的$a给unset掉了,可以在函数test()中加入print $a;来测试!

接着回到上面的例子1,看test_global中的这一代码"$var2 = &$var1;",上面是一个引用赋值运算,也就是$var2将指向var1所指向的物理内存地址,所以例子1执行过test_global函数以后,变量的变化只在函数的局部产生效应,在函数外部$var2的指向物理内存地址并没有变化,还是它自己.此时,就能理解为什么例子1执行完以后,$var2是0,而$var3是5了!

所以我们得出一个结论,在函数中global和$GLOBALS[]的区别在于:

global在函数产生一个指向函数外部变量的别名变量,而不是真正的函数外部变量,一但改变了别名变量的指向地址,就会发生一些意料不到情况,例如例子1.

$GLOBALS[]确确实实调用是外部的变量,函数内外会始终保持一致,可以对照下面两个列子再加深下印象:

global:

实例代码如下:

<?php
function myfunction() {
    global $bar;
    unset($bar);
}
$bar = "someting";
myfunction();
echo $bar;
?>
로그인 후 복사
로그인 후 복사

输出:someting

$GLOBALS[]:

<?php
function foo() {
    unset($GLOBALS[&#39;bar&#39;]);
}
$bar = "something";
foo();
echo $bar;
?>
로그인 후 복사
로그인 후 복사

输出:空

当按照上面的思路理解后,碰到下面的情况是不是又有些晕呢?

实例代码如下:

<?php
$a = 1;
$b = 2;
function Sum() {
    global $a, $b;
    $b = $a + $b;
}
Sum();
echo $b;
?>
로그인 후 복사
로그인 후 복사

输出将是 "3".在函数中申明了全局变量 $a 和 $b,任何变量的所有引用变量都会指向到全局变量.

怎么不是2呢,在函数外部不是不影响吗,请注意$b在函数中并没有通过引用修改,而是修改的$b指向物理内存的值,因此外部输入为3.

php中global和$GLOBALS不仅仅是写法不一样以为,2者的区别还是很大的,在实际应用中需要注意!

先看下面的PHP代码例子:

<?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";
?>
로그인 후 복사
로그인 후 복사

执行结果为:0 5

怎么会这样呢?不应该是2个5吗?怎么会出现1个0和1个5呢?

恩,我们保留以上问题,深入分析$GLOBALS和global的原理!我们都知道变量其实是相应物理内存在代码中的"代号"而已,引用php手册的$GLOBALS的解释:

Global 变量:$GLOBALS,注意: $GLOBALS 在 PHP 3.0.0 及以后版本中适用.

由所有已定义全局变量组成的数组.变量名就是该数组的索引.这是一个"superglobal",或者可以描述为自动全局变量.也就是说上面代码中的$var1和$GLOBALS['var1']是指的同一变量,而不是2个不同的变量!

下面来分析global到底做了什么?

引用php手册的global的解释:

如果在一个函数内部给一个声明为 global 的变量赋于一个引用,该引用只在函数内部可见.可以通过使用 $GLOBALS 数组避免这一点.我们都知道php中的函数所产生的变量都是函数的私有变量,那么global关键字产生的变量也肯定逃不出这个规则,为什么这么说呢,看下面的代码:

实例代码如下:

<?php
// 例子2
function test() {
    global $a;
    unset($a);
}
$a = 1;
test();
print $a;
?>
로그인 후 복사
로그인 후 복사

执行结果为:1

为什么会输出1呢?不是已经把$a给unset了吗?unset失灵了?php的bug?

都不是,其实unset起作用了,是把test函数中的$a给unset掉了,可以在函数test()中加入print $a;来测试!

接着回到上面的例子1,看test_global中的这一代码"$var2 =& $var1;",上面是一个引用赋值运算,也就是$var2将指向var1所指向的物理内存地址,所以例子1执行过test_global函数以后,变量的变化只在函数的局部产生效应,在函数外部$var2的指向物理内存地址并没有变化,还是它自己.

此时,就能理解为什么例子1执行完以后,$var2是0,而$var3是5了!

所以我们得出一个结论,在函数中global和$GLOBALS[]的区别在于:

global在函数产生一个指向函数外部变量的别名变量,而不是真正的函数外部变量,一但改变了别名变量的指向地址,就会发生一些意料不到情况,例如例子1.

$GLOBALS[]确确实实调用是外部的变量,函数内外会始终保持一致,可以对照下面两个列子再加深下印象:

global:

实例代码如下:

<?php
function myfunction() {
    global $bar;
    unset($bar);
}
$bar = "someting";
myfunction();
echo $bar;
?>
로그인 후 복사
로그인 후 복사

输出:someting

实例代码如下:

$GLOBALS[]:

<?php
function foo() {
    unset($GLOBALS[&#39;bar&#39;]);
}
$bar = "something";
foo();
echo $bar;
?>
로그인 후 복사
로그인 후 복사

输出:空

当按照上面的思路理解后,碰到下面的情况是不是又有些晕呢?

实例代码如下:

<?php
$a = 1;
$b = 2;
function Sum() {
    global $a, $b;
    $b = $a + $b;
}
Sum();
echo $b;
?>
로그인 후 복사
로그인 후 복사

输出将是 "3".在函数中申明了全局变量 $a 和 $b,任何变量的所有引用变量都会指向到全局变量.

怎么不是2呢,在函数外部不是不影响吗,请注意$b在函数中并没有通过引用修改,而是修改的$b指向物理内存的值,因此外部输入为3


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

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

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

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

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

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

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

프로파일링에 Windows 11 및 10 환경 변수를 사용하는 방법에 대한 가이드 프로파일링에 Windows 11 및 10 환경 변수를 사용하는 방법에 대한 가이드 Nov 01, 2023 pm 08:13 PM

환경 변수는 애플리케이션과 프로그램이 실행되는 위치(또는 환경)에 대한 경로입니다. 사용자가 생성, 편집, 관리 또는 삭제할 수 있으며 특정 프로세스의 동작을 관리할 때 유용합니다. Windows에서 개별적으로 편집할 필요 없이 여러 변수를 동시에 관리하기 위한 구성 파일을 만드는 방법은 다음과 같습니다. 환경 변수 Windows 11 및 10에서 프로필을 사용하는 방법 Windows에는 사용자 변수(현재 사용자에게 적용)와 시스템 변수(전역적으로 적용)라는 두 가지 환경 변수 세트가 있습니다. 그러나 PowerToys와 같은 도구를 사용하면 별도의 구성 파일을 만들어 새 변수와 기존 변수를 추가하고 한 번에 관리할 수 있습니다. 방법은 다음과 같습니다. 1단계: PowerToysPowerTo 설치

PHP7의 변수에 대한 엄격한 모드: 잠재적인 버그를 줄이는 방법은 무엇입니까? PHP7의 변수에 대한 엄격한 모드: 잠재적인 버그를 줄이는 방법은 무엇입니까? Oct 19, 2023 am 10:01 AM

엄격 모드는 개발자가 잠재적인 오류를 줄이는 데 도움이 될 수 있는 PHP7에 도입되었습니다. 이 기사에서는 엄격 모드가 무엇인지, PHP7에서 엄격 모드를 사용하여 오류를 줄이는 방법을 설명합니다. 동시에, 코드 예제를 통해 엄격 모드의 적용을 시연합니다. 1. 엄격 모드란 무엇입니까? 엄격 모드는 개발자가 보다 표준화된 코드를 작성하고 몇 가지 일반적인 오류를 줄이는 데 도움이 되는 PHP7의 기능입니다. 엄격 모드에서는 변수 선언, 유형 확인, 함수 호출 등에 대한 엄격한 제한 및 감지가 있습니다. 통과하다

Java의 인스턴스 변수 란 무엇입니까? Java의 인스턴스 변수 란 무엇입니까? Feb 19, 2024 pm 07:55 PM

Java의 인스턴스 변수는 메소드나 생성자가 아닌 클래스에 정의된 변수를 참조합니다. 인스턴스 변수는 멤버 변수라고도 합니다. 클래스의 각 인스턴스에는 인스턴스 변수의 자체 복사본이 있습니다. 인스턴스 변수는 객체 생성 중에 초기화되며 해당 상태는 객체 수명 동안 저장 및 유지됩니다. 인스턴스 변수 정의는 일반적으로 클래스의 맨 위에 배치되며 public, private, protected 또는 기본 액세스 한정자를 비롯한 모든 액세스 한정자를 사용하여 선언할 수 있습니다. 그것은 우리가 원하는 것이 무엇인지에 달려 있습니다.

내부 오류: 임시 디렉터리를 생성할 수 없습니다. [해결됨] 내부 오류: 임시 디렉터리를 생성할 수 없습니다. [해결됨] Apr 17, 2023 pm 03:04 PM

Windows 시스템에서는 사용자가 실행 파일/설정 파일을 사용하여 시스템에 다양한 유형의 응용 프로그램을 설치할 수 있습니다. 최근 많은 Windows 사용자가 실행 파일을 사용하여 응용 프로그램을 설치하려고 할 때 시스템에 INTERNALERROR:cannotCreateTemporaryDirectory라는 오류가 발생한다고 불평하기 시작했습니다. 문제는 이에 국한되지 않고 사용자가 Windows 시스템에도 설치된 기존 응용 프로그램을 시작하지 못하게 합니다. 몇 가지 가능한 이유는 다음과 같습니다. 관리자 권한을 부여하지 않고 설치하려면 실행 파일을 실행하세요. TMP 변수에 유효하지 않거나 다른 경로가 제공되었습니다. 손상된 시스템

Ajax를 사용하여 PHP 메소드에서 변수를 얻는 방법은 무엇입니까? Ajax를 사용하여 PHP 메소드에서 변수를 얻는 방법은 무엇입니까? Mar 09, 2024 pm 05:36 PM

Ajax를 사용하여 PHP 메소드에서 변수를 얻는 것은 웹 개발의 일반적인 시나리오입니다. Ajax를 통해 데이터를 새로 고치지 않고도 페이지를 동적으로 얻을 수 있습니다. 이 기사에서는 Ajax를 사용하여 PHP 메소드에서 변수를 가져오는 방법을 소개하고 구체적인 코드 예제를 제공합니다. 먼저 Ajax 요청을 처리하고 필요한 변수를 반환하기 위해 PHP 파일을 작성해야 합니다. 다음은 간단한 PHP 파일 getData.php에 대한 샘플 코드입니다.

Python 구문 마인드맵: 코드 구조에 대한 심층적인 이해 Python 구문 마인드맵: 코드 구조에 대한 심층적인 이해 Feb 21, 2024 am 09:00 AM

Python은 간단하고 읽기 쉬운 구문으로 다양한 분야에서 널리 사용됩니다. 프로그래밍 효율성을 높이고 코드 작동 방식을 깊이 이해하려면 Python 구문의 기본 구조를 숙지하는 것이 중요합니다. 이를 위해 이 기사에서는 Python 구문의 다양한 측면을 자세히 설명하는 포괄적인 마인드 맵을 제공합니다. 변수 및 데이터 유형 변수는 Python에서 데이터를 저장하는 데 사용되는 컨테이너입니다. 마인드맵은 정수, 부동 소수점 숫자, 문자열, 부울 값 및 목록을 포함한 일반적인 Python 데이터 유형을 보여줍니다. 각 데이터 유형에는 고유한 특성과 작업 방법이 있습니다. 연산자 연산자는 데이터 유형에 대한 다양한 작업을 수행하는 데 사용됩니다. 마인드맵은 산술 연산자, 비율 등 Python의 다양한 연산자 유형을 다룹니다.

Jul 24, 2023 pm 09:33 PM

PHP 함수 소개—strpos(): 변수가 문자열인지 확인합니다. PHP에서 is_string()은 변수가 문자열인지 확인하는 데 사용되는 매우 유용한 함수입니다. 변수가 문자열인지 확인해야 할 때 is_string() 함수를 사용하면 이 목표를 쉽게 달성할 수 있습니다. 아래에서는 is_string() 함수를 사용하는 방법에 대해 알아보고 관련 코드 예제를 제공합니다. is_string() 함수의 구문은 매우 간단합니다. 그것은 단지 필요하다

C 언어의 const에 대한 깊은 이해 C 언어의 const에 대한 깊은 이해 Feb 18, 2024 pm 12:56 PM

C에서 const에 대한 자세한 설명 및 코드 예 C 언어에서는 const 키워드를 사용하여 상수를 정의하는데, 이는 프로그램 실행 중에 변수의 값을 수정할 수 없음을 의미합니다. const 키워드를 사용하여 변수, 함수 매개변수 및 함수 반환 값을 수정할 수 있습니다. 이 기사에서는 C 언어에서 const 키워드 사용에 대한 자세한 분석을 제공하고 구체적인 코드 예제를 제공합니다. const 수정된 변수 const를 사용하여 변수를 수정하는 경우 이는 해당 변수가 읽기 전용 변수이고 값이 할당되면 수정할 수 없음을 의미합니다. 예: 상수

See all articles