`

php global 与 GLOBAL

    博客分类:
  • php
阅读更多
php global 与 GLOBAL

标签: 杂谈
须申明为全局(注意,Global这个关键字在函数中定义才有用)。
1:Global的作用是定义全局变量,但是这个全局变量不是应用于整个网站,而是应用于当前页面,包括include或require的所有文件。
复制代码代码如下:
<?PHP
$a=123;
function aa()
{
Global $a; //如果不把$a定义为global变量,函数体内是不能访问函数体外部的$a的,但是可以定义一个相同的名字$a,此时这个变量是局部变量,等同于C语言的局部变量,只能在函数体内部使用。
echo $a;
}
aa();
?>
总结:在函数体内定义的global变量,函数体外可以使用,在函数体外定义的global变量不能在函数体内使用,
复制代码代码如下:
$global $a;
$a=123;
function f()
{
echo $a; //错误,
}
//再看看下面一例
function f()
{
global $a;
$a=123;
}
f();
echo $a; //正确,可以使用
2: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文件。
3.一些Global和$GLOBALS 数组的例子
例子:使用 global
复制代码代码如下:
<?PHP
$w3sky = 1;
$w3sky2 = 2;
function Sum()
{
global $w3sky, $w3sky2;$w3sky2 = $w3sky + $w3sky2;
}Sum();
echo $w3sky2;
?>
以上脚本的输出将是“3”。在函数中申明了全局变量 $w3sky 和 $w3sky2,任何变量的所有引用变量都会指向到全局变量。对于一个函数能够申明的全局变量的最大个数,PHP 没有限制。
在全局范围内访问变量的第二个办法,是用特殊的 PHP 自定义 $GLOBALS 数组。前面的例子可以写成:
例子 使用 $GLOBALS 替代 global
复制代码代码如下:
<?PHP
$w3sky = 1;
$w3sky2 = 2;function Sum()
{
$GLOBALS['w3sky'] = $GLOBALS['w3sky'] + $GLOBALS['w3sky2'];
}Sum();
echo $w3sky2;
?>
在 $GLOBALS 数组中,每一个变量为一个元素,键名对应变量名,值对应变量的内容。$GLOBALS 之所以在全局范围内存在,是因为 $GLOBALS 是一个超全局变量。以下范例显示了超全局变量的用处:
例子 演示超全局变量和作用域的例子
复制代码代码如下:
<?PHP
function test_global()
{
// 大多数的预定义变量并不 "super",它们需要用 'global' 关键字来使它们在函数的本地区域中有效。
global $HTTP_POST_VARS;echo $HTTP_POST_VARS['name'];// Superglobals 在任何范围内都有效,它们并不需要 'global' 声明。Superglobals 是在 PHP 4.1.0 引入的。
echo $_POST['name'];
}
?>
global 也就是说在一个文件里 只要你声明为global $db 那么在声明的下面 你就可以引用这个$db了。
4.原来以为global和$GLOBALS除了写法不一样以为,其他都一样,可是在实际应用中发现,2者的区别还是很大的!
先看下面的例子:
复制代码代码如下:
<?php
// 例子1
function test_global() {
global $var1, $var2;
$var2 =& $var1;
}
function test_globals() {
$GLOBALS['var3'] =& $GLOBALS['var1'];
}
$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的原理!
我们都知道变量其实是相应物理内存在代码中的"代号",假设我们上面声明的3个变量分配的内存如下图表示:
引用php手册的$GLOBALS的解释:
Global 变量:$GLOBALS
注意: $GLOBALS 在 PHP 3.0.0 及以后版本中适用。
由所有已定义全局变量组成的数组。变量名就是该数组的索引。
这是一个“superglobal”,或者可以描述为自动全局变量。
也就是说上面代码中的$var1和$GLOBALS['var1']是指的同一变量,而不是2个不同的变量!
下面来分析global到底做了什么?
我们都知道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掉了,可以在函数后面加入
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函数以后,变量的变化由下图可以看出)
这一篇分析的不够透彻,不明白的请看《global和$GLOBALS[]的分析之二》其中举一反三通俗易懂
PHP代码
复制代码 代码如下:
<?php
// 例子1
function test_global() {
global $var1, $var2;
$var2 =& $var1;
}
function test_globals() {
$GLOBALS['var3'] =& $GLOBALS['var1'];
}
$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代码
复制代码 代码如下:
<?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['bar']);
}
$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。

你可能看到有个pc1234博客与这个差不多的内容,没有错,pc1234新浪博客也是我的
分享到:
评论

相关推荐

    php_的global问题

    1. **大小写敏感**:在使用`global`关键字或`$GLOBALS`数组时,变量名的大小写必须与定义时一致。 2. **性能考量**:频繁使用`global`或`$GLOBALS`可能会导致代码可读性和维护性降低,且可能引起性能开销,应谨慎...

    全局变量与 `global` 关键字:在 PHP 函数中的使用与最佳实践

    PHP 提供了 global 关键字,允许在函数内部访问全局变量。本文将详细探讨 global 关键字的用法、它在函数中的作用,以及如何使用它来管理全局变量的访问。 global 关键字是 PHP 中访问全局变量的一种方式。然而,...

    深入理解PHP中的global

    了解了`global`的用法后,我们也可以看看其他与数组遍历相关的PHP知识。PHP提供了多种遍历数组的方法,如`foreach`、`list()`、`each()`以及`while`循环等。例如,`foreach`是最常用的遍历方式,适用于大多数数组和...

    discuz代码分析--global.func篇

    `global.func.php`中包含了一些与用户权限和管理相关的函数,如`checkperm`, `checkadminip`等。`checkperm`用于检查用户是否具备执行特定操作的权限,`checkadminip`则用于验证管理员的登录IP是否在允许范围内,...

    PHP Global定义全局变量使用说明

    在PHP编程语言中,`global` 关键字是用来在函数内部访问和操作全局变量的关键工具。全球变量在脚本的整个生命周期中都是可访问的,而不仅仅是局限于某个函数或特定的代码块。然而,需要注意的是,PHP的变量作用域...

    PHP global全局变量经典应用与注意事项分析【附$GLOBALS用法对比】 原创

    本文实例讲述了PHP global全局变量的使用与注意事项。分享给大家供大家参考,具体如下: 使用global在方法里面声明外部变量为全局变量,即可以调用该变量。 示例1. global基本用法 &lt;?php $a=1; $b=2; test_...

    php代码-global

    在PHP编程语言中,`global`关键字是用来在函数或类的方法内部访问全局变量的关键字。全局变量是在函数外部定义的变量,它们在整个脚本的生命周期内都存在,可以在任何地方被引用,除非被局部作用域覆盖。理解并合理...

    global-mapper-18-2-getting-started-en

    ### Global Mapper 18.2 入门指南 ...- **下载地址**:Global Mapper 的最新版本可以从 Blue Marble Geographics 官方网站免费下载:[www.bluemarblegeo.com/global-mapper/product/download_complete.php]...

    Laravel开发-global-routing

    在Laravel框架中,全局路由是构建应用程序的基础,它定义了HTTP请求与控制器或函数之间的对应关系。"Laravel开发-global-routing" 主题深入探讨了如何在Laravel 5中设置和管理全局路由,以便高效地映射URL到特定的...

    php中global和$GLOBALS[]的分析之一

    5. `global`与`$GLOBALS`的区别: - `global`关键字用于在函数内部引用全局变量,而`$GLOBALS`数组则直接提供了对全局变量的访问。 - 使用`global`需要知道变量名,而`$GLOBALS`可以动态访问任何全局变量,但这种...

    全局变量中$GLOBALS['']和global的区别

    此外,如果在函数内部定义了一个与全局变量同名的局部变量,`global`将不会影响到这个局部变量。 接下来,`$GLOBALS`数组则是一种直接访问全局变量的方式。它是一个包含所有全局变量的数组,键是变量名,值是变量的...

    PHP 闭包获取外部变量和global关键字声明变量的区别讲解

    在这个例子中,`global`关键字使得函数内的`$global`与外部的`$global`变量关联,所以在`$fun`内部修改`$global`的值,也会改变外部的`$global`。 接下来,让我们对比一下两者之间的差异。假设我们有以下代码: ``...

    PHP Global变量定义当前页面的全局变量实现探讨

    PHP Global变量在实际应用中会发现许多问题需要我们不断的去完善处理。我们在这篇文章中就针对PHP Global变量出现的问题给出了一些具体的解决办法。 1:PHP Global变量的作用是定义全局变量,但是这个全局变量不是...

    php多次include后导致全局变量global失效的解决方法

    本文实例讲述了php多次include后导致全局变量global失效的解决方法。分享给大家供大家参考。具体分析如下: 在多个文件中,文件一个接一个include,但最后一个文件里的函数使用global后却无法引用全局变量。例如: a...

    php中全局变量global的使用演示代码

    在PHP中,全局变量(global)是那些在函数外部定义的变量,可以在整个脚本范围内访问,而不仅仅限于某个特定的函数或方法。然而,当在函数内部试图访问这些全局变量时,需要通过`global`关键字来显式声明。 下面...

    PHP global全局变量经典应用与注意事项分析【附$GLOBALS用法对比】 <font color=red>原创</font>

    根据global关键字的等价用法,这与直接使用$GLOBAL['a']是一样的,因此函数内部对$a的操作也会反映到外部变量$a上。 ### 注意事项 使用$GLOBAL数组时需要注意到以下几点: 1. $GLOBAL是一个数组,它的键是全局...

    phpcms global.func.php分页样式修改

    phpcms global.func.php分页样式修改,多功能分页。

    php代码-PHP global 关键字

    你可以通过`$GLOBALS['variable_name']`来访问全局变量,但这并不推荐,因为它与`global`关键字一样,增加了代码的复杂性和潜在错误。 ```php &lt;?php $my_global = "Using $GLOBALS array"; function show_global()...

    global-iris:在 PHP 中集成 Global IRIS (HSBC) 支付

    在 PHP 中集成 Global IRIS (HSBC) 支付 2015 年 3 月 6 日星期五 Global IRIS (HSBC) 支付整合 将 Global IRIS (HSBC) 支付系统集成到您的网站可能有点令人生畏,但遵循以下步骤可能会让您的生活更轻松。 事实上,...

    PHP const定义常量及global定义全局常量实例解析

    总结一下,`const`和`global`在PHP中分别用于定义不可变的类常量和引用全局作用域中的变量。`const`常量在类中使用,不可在运行时定义,且具有继承性;而`global`关键字用于在函数内部访问全局变量,`$GLOBALS`数组...

Global site tag (gtag.js) - Google Analytics