php中,由于作用域的限制,导致变量的访问限制:

1、局部作用域内不能访问全局变量

2、全局作用域内不能访问局部变量

对于第一种情况,如下代码将不能正常运行:

<?php
//局部作用域(函数内)使用全局变量
$a = 1;//在全局作用域内的变量
function test() {
echo "a = {$a}<br />";//在局部作用域中访问全局作用域变量
} test(); /*
运行结果:
Notice: Undefined variable: a in /Users/lyq/mysite/index.php on line 11
a =
*/
?>

那么要想在局部作用域内正常使用全局作用域变量,该怎么做呢?

方法一:在局部作用域内,使用global关键字声明与全局作用域变量名称相同的变量即可。原因:这样声明之后,全局作用域内的变量和局部作用域内与之同名的变量指向了同一块内存。让代码说话:

<?php
//局部作用域(函数内)使用全局变量
$a = 1;//在全局作用域内的变量(暂时称之为“外部的$a”)
function test() {
/*
为了使用外部的$a,在此处通过global关键字声明一个与之名称相同的
变量“$a”(暂时称之为“内部的$a”),这两个变量指向同一块内容,顾可以在局部作用域内正常使用和修改。
*/
global $a;//如果不声明,将不能正常使用外部的$a
echo "a = {$a}<br />";//在局部作用域中访问全局作用域变量 $a = 100;//通过内部的$a,来修改$a的值   /*
    注意:这么做不会销毁变量,因为此时已经有两个引用指向了这块内容,这么做仅仅是断开了一个引用而已
    所以,如果解注释下面一行的代码,运行结果依然正常.
  */
  //unset($a);
}
test();
echo "在test函数内部修改了\$a的值,此时\$a = $a"; /*
运行结果:
a = 1
在test函数内部修改了$a的值,此时$a = 100
*/
?>

方法二:使用$GLOBALS来访问全局变量。

<?php
//局部作用域(函数内)使用全局变量
$a = 1;//在全局作用域内的变量
function test() {
/*
使用$GLOBALS来访问$a的值:$GLOBALS对全局变量的使用,可以看做是全局变量的
另一种语法形式,而不是“引用”关系
*/
echo "a = {$GLOBALS['a']}<br />";//在局部作用域中使用$GLOBALS访问全局作用变量 $GLOBALS['a'] = 100;//通过$GLOBALS['a'],来修改$a的值
/*
由于$GLOBALS['a']仅仅是全局变量$a的另一种语法形式,所以使用$GLOBALS['a']并不会
建立新的引用,所以如果调用了下面的代码,程序将不能正常运行,输出结果: a = 1 Notice: Undefined variable: a in /Users/lyq/mysite/index.php on line 21
在test函数内部修改了$a的值,此时$a =
*/
//unset($GLOBALS['a']);
}
test();
echo "在test函数内部修改了\$a的值,此时\$a = $a"; /*
运行结果:
a = 1
在test函数内部修改了$a的值,此时$a = 100
*/
?>

注意:

通过方法一来使用全局变量$a,实际上是建立了一个新的引用,所以如果使用unset($a),这个时候是不会销毁变量的。如果将方法一代码的"//unset($a);"解注释后运行,仍然能输出正确的结果。但是$GLOBALS['a']仅仅是是全局变量的的另一种语法形式,并没有建立新的引用,所以,如果解注释方法二中的"//unset($GLOBALS['a']);",程序将无法正常运行。

php中在局部作用域内访问全局变量的更多相关文章

  1. JavaScript中的局部作用域及常量的定义

    局部作用域 通常JavaScript的作用域是函数内部,在类似for循环的语句块中是无法申明局部变量的. function exm() { for (var i=0; i<100; i++) { ...

  2. PHP函数内访问全局变量

    $dbcon='123'; 方法一.funtion fun1(){global $dbcon;$dbcon-> 就可以访问了.} 方法二$GLOBALS['$dbcon'];

  3. 在sql server 中查找一定时间段内访问数据库情况

    total_worker_time AS [总消耗CPU 时间(ms)], execution_count [运行次数], qs.total_worker_time AS [平均消耗CPU 时间(ms ...

  4. php访问全局变量

    函数之外声明的变量拥有 Global 作用域,只能在函数以外进行访问. 函数内部声明的变量拥有 LOCAL 作用域,只能在函数内部进行访问. PHP 同时在名为 $GLOBALS[index] 的数组 ...

  5. Python中变量的作用域

    一.变量作用域的含义 变量的作用域说白了就是变量的值从哪里获取,或者说变量取值的地方 我们在写代码过程中会用到很多变量,这些变量会出现在各种代码块中,有的出现在函数块里,有的在函数块外,例如: def ...

  6. JavaScript基础&实战(4)js中的对象、函数、全局作用域和局部作用域

    文章目录 1.对象的简介 2.对象的基本操作 2.1 代码 2.2 测试结果 3.属性和属性值 3.1 代码 3.2 测试结果 4.对象的方法 4.1 代码 4.2 测试结果 5.对象字面量 5.1 ...

  7. javaScript中的小细节-局部作用域中的var

    javaScript中var是很神奇的,在局部作用域中,var a = b = c = 1;是不一样的,a为使用var声明的变量,而b和c则是全局下的,此类变量被称为隐式全局变量:var a = 1; ...

  8. Android(java)学习笔记150:为什么局部内部类只能访问外部类中的 final型的常量

    为什么匿名内部类参数必须为final类型: 1)  从程序设计语言的理论上:局部内部类(即:定义在方法中的内部类),由于本身就是在方法内部(可出现在形式参数定义处或者方法体处),因而访问方法中的局部变 ...

  9. Android(java)学习笔记93:为什么局部内部类只能访问外部类中的 final型的常量

    为什么匿名内部类参数必须为final类型: 1)  从程序设计语言的理论上:局部内部类(即:定义在方法中的内部类),由于本身就是在方法内部(可出现在形式参数定义处或者方法体处),因而访问方法中的局部变 ...

随机推荐

  1. 解决windows下文件拷贝到ubuntu下文件名乱码的问题

    sudo apt-get install convmv     解压zip文件:    convmv -f gbk -t utf8 -r --notest *

  2. 29、Django实战第29天:修改密码和头像

    修改头像 1.上传头像,我们需要的对它做一个forms验证,编辑users.forms.py ... from .models import UserProfile class UploadImage ...

  3. ubuntu 修改权限

    在linux终端先输入ll,可以看到如: -rwx-r–r– (一共10个参数) 表示文件所属组和用户的对应权限. 第一个跟参数属于管理员,跟chmod无关,先不管. 2-4参数:属于user 5-7 ...

  4. 【块状树】bzoj3720 Gty的妹子树

    块状树.教程见:http://z55250825.blog.163.com/blog/static/1502308092014163413858/将树按一定大小分块,分成许多子树,在每个子树的根节点记 ...

  5. 【强联通分量缩点】【搜索】bzoj2208 [Jsoi2010]连通数

    两次dfs缩点,然后n次dfs暴搜. #include<cstdio> #include<vector> #include<cstring> using names ...

  6. python3 开发面试题(去重保持原来的顺序)6.2

    """ l1 = [11, 2, 3, 22, 2, 4, 11, 3] 去重并保持原来的顺序 """ #方式一 for 循环方法 l1 = ...

  7. 杂谈PID控制算法——第二篇:调·三个量

    上面一篇文章讲了一下PID算法中的三个常量大致的在PID算法中起的一个作用,但在实际的使用中,究竟应该如何调节(或者用更加专业的话说是整定)PID控制算法的三个.首先可以将KP,KI,KD三个常量全部 ...

  8. 调试手机上网页 (断点 console timeline 选择dom)

    用手机看网页,越来越多,手机app套个webview的也很多,那该如何调试手机上的页面了?比如 断点,选dom,console,控制台输出,查看内存,== 嗯,万能的的chrome和safari还是帮 ...

  9. Kingdee Apusic 中间件有关资料

    Kingdee Apusic 中间件有关资料: 1.官方网站:http://www.apusic.com 2.资料目录:http://www.apusic.com/dist 3.Apusic 8 资料 ...

  10. JS中的Math.pow(a,b)方法

    定义和用法 pow() 方法可返回 x 的 y 次幂的值. 语法 Math.pow(x,y) 参数 描述 x 必需.底数.必须是数字. y 必需.幂数.必须是数字. 返回值 x 的 y 次幂. 说明 ...