PHP变量作用域
PHP 的全局变量和 C 语言有一点点不同,在 C 语言中,全局变量在函数中自动生效,除非被局部变量覆盖,这可能引起一些问题,有些人可能不小心就改变了一个全局变量。PHP 中全局变量在函数中使用时必须声明为 global。
PHP: 变量范围 - Manual
全局变量
在函数范围之外所声明的变量就是全局变量。由于函数可以视为单独的程序片段,所以局部变量会覆盖全局变量的能见度,因此在函数中并无法直接调用使用全局变量。
局部变量
在函数之中声明的变量就是局部变量,并且该变量只有在函数范围之中才能加以使用。如果其它程序局部需要调用使用该变量值时,必须透过return指令,来将其传回至主程序区块以作后续处理。
函数内使用全局变量
1、通过传参方式将变量传入函数内部使用函数内部不能改变全局变量的值
可以在传参数时形参使用&符号与外部全局变量建立引用关系,这样可以更改全局变量的值。
$a=10;
function canshu($x){
echo $x;
}
canshu($a);//输出10
2、通过global关键字声明一个与全局变量同名的局部变量需先声明后使用(实质上是建立了引用关系)此时在函数里面可以修改全局变量的值;unset后引用关系没有了,但外部全局变量依旧存在。
$a=10;
function quanju(){
global $a;
echo $a;
unset($a);//unset后引用关系没有了,但外部全局变量依旧存在
var_dump($a);//null
}
quanju();//输出10
echo '<br/>out:';
echo $a;//输出10
3、使用超全局数组GLOBALS
此时在函数里面可以修改全局变量的值;
unset后外部全局变量也不存在了。
$name='Bob';//全局变量$name也属于超全局数组GLOBALS的成员之一
echo '<pre>';
// print_r($GLOBALS);
echo '</pre>';
echo $GLOBALS['name'];
function chao(){
echo $GLOBALS['name'];
$GLOBALS['name']='Allen';//将改变外部全局变量$name的值
unset($GLOBALS['name']);//将unset外部全局变量$name的值
}
echo '<br/>in:';
chao();//Bob
echo '<br/>out:';
var_dump($name);//null
静态变量(static)
PHP支持声明函数变量为静态的(static)。
一个静态变量在所有对该函数的调用之间共享,并且仅在脚本的执行期间函数第一次被调用时被初始化。
要声明函数变量为静态的用关键字static。通常,静态变量的第一次使用时赋予一个初始值。
函数内使用静态变量关键字static声明的变量在执行完函数后不会被释放,下一次函数调用仍然生效。
function add(){
static $a=0;
echo $a;
$a++;
}
add();//0
echo "<hr/>";
add();//1
echo "<hr/>";
add();//2
UPDATE
2016-1-9 16:54:19
Javascript语言函数内部可以直接读取全局变量。
学习Javascript闭包(Closure) - 阮一峰的网络日志
http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html
PHP变量作用域的更多相关文章
- javascript中的变量作用域以及变量提升
在javascript中, 理解变量的作用域以及变量提升是非常有必要的.这个看起来是否很简单,但其实并不是你想的那样,还要一些重要的细节你需要理解. 变量作用域 “一个变量的作用域表示这个变量存在的上 ...
- [转]深入理解JavaScript的变量作用域
1.JavaScript的作用域链 2.函数体内部,局部变量的优先级比同名的全局变量高. 3.JavaScript没有块级作用域. 4.函数中声明的变量在整个函数中都有定义. 5.未使用var关键字定 ...
- Java基础知识笔记(七:接口、变量作用域和参数传递)
一.接口 Java语言不允许一个子类拥有多个直接父类,即任何子类只能有一个直接父类.但允许一个类实现多个接口,即在定义类的接口名称列表中可以包含1个或多个接口名称,从而实现多重继承的特性.接口的定义格 ...
- PHP常量、变量作用域详解(一)
PHP 中的每个变量都有一个针对它的作用域,它是指可以在其中访问变量(从而访问它的值)的一个领域.对于初学者来说,变量的作用域是它们所驻留的页面.因此, 如果你定义了 $var,页面余下部分就可以访问 ...
- PHP变量作用域详解(二)
学过C的人用PHP的时候一般会相当顺手,而且感到PHP太方便太轻松.但在变量作用域这方面却与C有不同的地方,搞不好会相当郁闷,就找不到错误所在.昨晚就与到这么一个问题,是全局变量在函数中的问题.今天搜 ...
- JavaScript函数定义和调用 变量作用域
本文是笔者在看廖雪峰老师JavaScript教程时的个人总结 JavaScript中函数定义可以是这样的格式 function 函数名(参数) { 函数体 } 也可以是这样的格式 ...
- JavaScript 变量作用域
一. 变量声明 变量用var关键字来声明,如下所示: 变量在未声明的情况下被初始化,会被添加到全局环境. JavaScript执行代码时,会创建一个上下文执行环境,全局环境是最外围的环境.每个函数在被 ...
- 变量作用域&函数作用域
一. 变量作用域 1)全局变量 在全局环境下声明的变量被视为全局变量. 在没有使用var进行声明的时候,变量就被定义为全局变量.在ES5的严格模式下,如果变量没有使用var来声明是会报错的. 2)局部 ...
- OC点语法和变量作用域
OC点语法和变量作用域 一.点语法 (一)认识点语法 声明一个Person类: #import <Foundation/Foundation.h> @interface Person : ...
- python的变量作用域问题
偶然掉进了一个坑里.仔细分析了下原因.原来是变量作用域的问题.简单抽象如下: id=1 #许多行代码 [id for id in range(10)] #许多行代码 if id!=1: #做一些事情 ...
随机推荐
- JavaScript对UNIX时间戳的转换
<script type="text/javascript"> var timestamp = '1479886513'; var d = new Date(times ...
- iis最大工作进程数
IIS 6.0允许将应用程序池配置成一个Web园(Web Garden).要理解Web园的概念,可以设想这样一种情形:假设有一个IIS 5.0服务器和三个Web网站,每一个Web网站运行着相同的应用程 ...
- gulp 配置前端项目打包
项目发布时,需要对项目js文件进行压缩,混淆,连接等操作以减小项目http请求,加快访问. gulpjs.com中有很多插件可以用来配置打包部署. 需要用的常用插件有: gulp-jsmin 压缩j ...
- vs.net2008工具栏上找不到debug/release选项
使用vs.net多年,以前不时会用到release发布,近几年几乎不用的.近来生成时感觉有些项目使用了release选项,因为生成的dll的位置变了.于是想调整回bebug,发现vs.net2008的 ...
- CSS盒模型
CSS盒模型是CSS 可视化格式化系统的基石,它是理解样式表如何工作的核心概念.盒模型用于元素定位和页面布局.元素框的最内部分是实际的内容,直接包围内容的是内边距.内边距呈现了元素的背景.内边距的边缘 ...
- 《Linux内核分析》之第四章读书笔记
4.1多任务 多任务操作系统:同时并发地交互执行多个进程的操作系统 多任务操作系统会使多个进程处于堵塞或者睡眠状态.这些任务尽管位于内存,但是并不处于可运行状态.这些进程利用内核堵塞自己,直到某一事件 ...
- poi解析excel 03、07
maven依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</a ...
- select 取的是session里面的值时
原来是写了一个select标签,然后用js循环取出来,发现问题是本来嵌在页面右边的页面整个弹出来, 后来改成html:optionsCollection就好了: 效果图:
- 强大的swift字符串
Swift集百家之长,吸收了主流语言java,c,c++等的好的特性,所以它功能十分强大,今天我们就来看看它强大的字符串. 首先,我们带着这样几个问题去了解.理解swift的字符串. 1.swift字 ...
- js 获取样式兼容方法
function getStyle(obj, attr) { if(obj.currentStyle) { return obj.currentStyle[attr]; } else { return ...