php中在局部作用域内访问全局变量
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中在局部作用域内访问全局变量的更多相关文章
- JavaScript中的局部作用域及常量的定义
局部作用域 通常JavaScript的作用域是函数内部,在类似for循环的语句块中是无法申明局部变量的. function exm() { for (var i=0; i<100; i++) { ...
- PHP函数内访问全局变量
$dbcon='123'; 方法一.funtion fun1(){global $dbcon;$dbcon-> 就可以访问了.} 方法二$GLOBALS['$dbcon'];
- 在sql server 中查找一定时间段内访问数据库情况
total_worker_time AS [总消耗CPU 时间(ms)], execution_count [运行次数], qs.total_worker_time AS [平均消耗CPU 时间(ms ...
- php访问全局变量
函数之外声明的变量拥有 Global 作用域,只能在函数以外进行访问. 函数内部声明的变量拥有 LOCAL 作用域,只能在函数内部进行访问. PHP 同时在名为 $GLOBALS[index] 的数组 ...
- Python中变量的作用域
一.变量作用域的含义 变量的作用域说白了就是变量的值从哪里获取,或者说变量取值的地方 我们在写代码过程中会用到很多变量,这些变量会出现在各种代码块中,有的出现在函数块里,有的在函数块外,例如: def ...
- JavaScript基础&实战(4)js中的对象、函数、全局作用域和局部作用域
文章目录 1.对象的简介 2.对象的基本操作 2.1 代码 2.2 测试结果 3.属性和属性值 3.1 代码 3.2 测试结果 4.对象的方法 4.1 代码 4.2 测试结果 5.对象字面量 5.1 ...
- javaScript中的小细节-局部作用域中的var
javaScript中var是很神奇的,在局部作用域中,var a = b = c = 1;是不一样的,a为使用var声明的变量,而b和c则是全局下的,此类变量被称为隐式全局变量:var a = 1; ...
- Android(java)学习笔记150:为什么局部内部类只能访问外部类中的 final型的常量
为什么匿名内部类参数必须为final类型: 1) 从程序设计语言的理论上:局部内部类(即:定义在方法中的内部类),由于本身就是在方法内部(可出现在形式参数定义处或者方法体处),因而访问方法中的局部变 ...
- Android(java)学习笔记93:为什么局部内部类只能访问外部类中的 final型的常量
为什么匿名内部类参数必须为final类型: 1) 从程序设计语言的理论上:局部内部类(即:定义在方法中的内部类),由于本身就是在方法内部(可出现在形式参数定义处或者方法体处),因而访问方法中的局部变 ...
随机推荐
- POJ 3553 Task schedule【拓扑排序 + 优先队列 / 贪心】
Task schedule Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 515 Accepted: 309 Special J ...
- 洛谷——P1033 自由落体
P1033 自由落体 题目描述 在高为 H 的天花板上有 n 个小球,体积不计,位置分别为 0,1,2,….n-1.在地面上有一个小车(长为 L,高为 K,距原点距离为 S1).已知小球下落距离计算公 ...
- Eclipse Build all and build project not working - jar missing
Eclipse Build all and build project not working - jar missing
- 在Strust2 使用datatimepicker 标签引发的一系列问题
问题:出现无法识别的问题 原因:Strust2.1开始,对于ajax类的标签不再使用<%@ taglib prefix="s" uri="/struts-tags& ...
- 【bzoj1604】【[Usaco2008 Open]Cow Neighborhoods】简单的谈谈曼哈顿距离
(最近p站上不去要死了) Description 了解奶牛们的人都知道,奶牛喜欢成群结队.观察约翰的N(1≤N≤100000)只奶牛,你会发现她们已经结成了几个"群".每只奶牛在吃 ...
- python3中的range函数
奇怪的现象 在paython3中 print(range(10)) 得出的结果是 range(0,10) ,而不是[0,1,2,3,4,5,6,7,8,9] ,为什么呢? 官网原话: In many ...
- JS删除数组中某一项或几项的方法汇总
1.JS中的splice方法 splice(index, len, [item]) //注意:该方法会改变原始数组. splice有3个参数,它也可以用来替换/删除/添加数组内某一个或者几个值. ...
- 更合理的 setState()
原文发表在我的博客:http://www.erichain.me/2017/04/17/2017-04-17-more-reasonable-setstate/ React 是我做前端以来接触到的第三 ...
- jquery给input标签添加data-options属性
//原生JS实现document.getElementById('startPrice').setAttribute("data-options", "required: ...
- [Git] 根据commiter过滤该用户的所有提交
git log --pretty=oneline --author="xxxx" -(n) 仅显示最近的 n 条提交 --since,--after 仅显示指定时间之后的提交 -- ...