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) 从程序设计语言的理论上:局部内部类(即:定义在方法中的内部类),由于本身就是在方法内部(可出现在形式参数定义处或者方法体处),因而访问方法中的局部变 ...
随机推荐
- STL模板整理 pair
pair pair是一种模板类型,其中包含两个数据值,两个数据的类型可以不同.如果一个函数有两个返回值的话,如果是相同类型,就可以用数组返回,如果是不同类型,就可以自己写个struct ,但为了方便就 ...
- 山东省第六届省赛 BIGZHUGOD and His Friends II(赛瓦定理)
Description BIGZHUGOD and his three friends are playing a game in a triangle ground. The number of B ...
- Python:文件操作技巧(File operation)(转)
Python:文件操作技巧(File operation) 读写文件 # ! /usr/bin/python # -*- coding: utf8 -*- spath = " D:/dow ...
- CF 862A Mahmoud and Ehab and the MEX【数组操作】
A. Mahmoud and Ehab and the MEX time limit per test 2 seconds memory limit per test 256 megabytes in ...
- office中密码的移除方法
密码有两种,一种是修改密码,一种是访问密码,通常两种密码的创建位置不同.对于访问密码,只需要在文件→信息 中将密码删除 对于修改密码,则要输入密码以后另存,然后在保存窗口里边点工具,下拉菜单里选常规选 ...
- 洛谷——P1375 小猫
P1375 小猫 题目描述 有2n只小猫站成一圈,主人小明想把它们两两之间用绳子绑住尾巴连在一起.同时小明是个完美主义者,不容许看到有两根绳子交叉.请问小明有几种连线方案,可以把让所有小猫两两配对? ...
- SHELL 在指定行的前/后插入指定内容
#如果知道行号可以用下面的方法 sed -i '88 r b.file' a.file #在a.txt的第88行插入文件b.txt awk '1;NR==88{system("cat ...
- Xamarin XAML语言教程构建ControlTemplate控件模板 (二)
Xamarin XAML语言教程构建ControlTemplate控件模板 (二) (2)打开MainPage.xaml文件,编写代码,将构建的控件模板应用于ContentView中.代码如下: &l ...
- elasticsearch将数据导出json文件【使用elasticdump】
1.前提准备 需要使用npm安装,还未安装的朋友可以阅读另一篇我的博客<安装使用npm>,windows环境. 2.安装es-dump 打开终端窗口PowerShell或者cmd. 输入命 ...
- 定义DoubleArray并将其作为value写入SequenceFile
1)上代码: /** * Created with IntelliJ IDEA. * User: hadoop * Date: 16-1-20 * Time: 下午7:30 * To change t ...