文档章节

PHP变量作用域

别人说我名字很长
 别人说我名字很长
发布于 2013/12/29 12:07
字数 1082
阅读 22
收藏 0
点赞 0
评论 0

PHP变量作用域

作用域的概念:

在PHP脚本的任何位置都可以声明变量,但是,声明变量的位置会大大影响访问变量的范围。这个可以访问的范围称为作用域。

主要的分类:局部变量、全局变量、静态变量。

1、局部变量:就是在函数内声明的变量,他保存在内存的栈内,所以访问速度很快。仅在函数内有效。

2、全局变量:与局部变量相反,全局变量可以在程序的任何地方访问。只要在变量前面加关键字GLOBAL,就可以将其识别为全局变量。在整个php文件内有效。

3、静态变量:用static修饰只存在于函数作用域的变量,函数执行结束后其值并不消失。注:初始化后不能再次进行初始化,不能用表达式来赋值。

function test() 

static $b=0;//申明静态变量,放在函数外部声明的话,在函数内部是用不到的

$b=$b+1; 

echo $b; 

test();//这条语句会输出 $b的值 为1 

test();//这条语句会输出 $b的值 为2 

附A:类中静态成员和静态方法,差不多只是调用的时候统一使用类名或者self或者parent加::xxx,他们的作用域和这个一样

附B:js里面的作用域使:用var aa=‘xxx’;在函数外面声明的就是全局变量(不管是否带有修饰符var)。在函数内部使用 var声明的是局部变量,不使用var修饰的是全局变量。

附C:关于引用

PHP引用:就是在变量、函数或者对象前加&.php中的引用就是想用不同的名字访问同一个变量的内容。

1、变量的引用:

$a="ABC"; 

$b =&$a; 

echo $a;//这里输出:ABC 

echo $b;//这里输出:ABC 

$b="EFG"; 

echo $a;//这里$a的值变为EFG 所以输出EFG 

echo $b;//这里输出EFG

2、函数的传址调用

function test(&$a) 

$a=$a+100; 

$b=1; 

echo $b;//输出1 

test($b); //这里$b传递给函数的其实是$b的变量内容所处的内存地址,通过在函数里改变$a的值 就可以改变$b的值了 

echo "<br>"; 

echo $b;//输出101 

3、函数的引用返回

function &test() 

static $b=0;//申明一个静态变量 

$b=$b+1; 

echo $b; 

return $b; 

$a=test();//这条语句会输出 $b的值 为1 

$a=5; 

$a=test();//这条语句会输出 $b的值 为2 

$a=&test();//这条语句会输出 $b的值 为3 

$a=5; 

$a=test();//这条语句会输出 $b的值 为6 

解析:使用$a=test()得到的其实不是函数的引用返回。只是将函数的返回值复制给$a,而不会影响到$b。这样调用和普通的调用没区别。

Php规定:$a=&test()方式得到才是函数的引用返回。他将$b变量的内存地址和$a变量的内存地址指向了同一个地方。即相当于$a=&$b;

4、取消引用

$a = 1; 

$b =& $a; 

unset ($a); 

echo $b;

解析:unset一个引用,只是取消了变量名和变量的内容之间的绑定,并不意味着内容被销毁,其值还是真实存在的。

5、global引用:使用global $var  声明一个变量时,其实就是建立了一个到全局变量的引用。Global $val <=> $var=&$GLOBALS[‘var’] ;

6、对象的引用:在对象的方法中,$this调用的对象都是调用它的引用

注:php中对于地址的指向不是由用户自己来实现的,而是通过zend核心实现的,php的引用采用的是“写拷贝”的原理,就是除非发生写操作,指向同一个地址的变量或对象是不会被拷贝的。

$a = 1; 

$b =$a; 

$a$b都是指向同一个内存地址,并不是$a$b占用不同的内存。

若是现在执行一句$a=”dsd”:$a和$b所指向的内存数据需要重新写一次,此时zend核心会自动判断。自动为$b产生一个$a的数据拷贝,重新申请一块内存进行存储。

版权归TP的乐乐

© 著作权归作者所有

共有 人打赏支持
别人说我名字很长
粉丝 55
博文 243
码字总数 97391
作品 0
济南
程序员
(非常重要)如何正确理解PHP之include,require等包含作用域

标题复制他人 这两天遇到一个问题,一个外部类库的入口文件,声明了一些类库依赖的php扩展定义的全局变量,所有后续的调用都依赖这些全局变量,如果没有取到这些变量,就会导致php-fpm子进程...

waveer ⋅ 2016/03/04 ⋅ 0

兽哥手打--->第一发、PHP 变量

PHP 变量 0.0.1 创建声明变量 例子: 剖析:在php中,例如x,y,z 都称之为变量 PHP没有声明的变量,在赋值时被创建。 与代数相似,可以给x,y,z 赋值, 变量可以是很短的名称(如x和y ) 或者更...

D1丶NA ⋅ 2017/07/22 ⋅ 0

杨宗德浅谈PHP变量作用域以及地址的问题

  杨宗德浅谈PHP变量作用域以及地址的问题。杨宗德主要详细的介绍了PHP变量作用域以及地址引用问题,供需要学习的朋友参考。   作用域的概念:   在PHP脚本的任何位置都可以声明变量,...

学习在线 ⋅ 2014/03/06 ⋅ 8

匿名函数和闭包

真正的匿名函数 在PHP5.3引入的众多功能中, 除了匿名函数还有一个特性值得讲讲: 新引入的invoke 魔幻方法。 这个魔幻方法被调用的时机是: 当一个对象当做函数调用的时候, 如果对象定义了i...

金于虎 ⋅ 2016/12/23 ⋅ 0

PHP(六)函数

当程序代码多了以后,用函数来组织这些程序。PHP最初的设计原则是用函数来组织程序,以让一段代码形成一个”程序模块“,不管在什么地方使用这些函数时,即可调用函数,省去了重复编写代码的...

ChuckleLiu ⋅ 2015/12/22 ⋅ 0

深入理解PHP原理之变量作用域(Scope in PHP)

我前面的文章(深入理解PHP原理之变量(Variables inside PHP))介绍了PHP变量的内部表示,但是,问题是,这些内部表示是如何和用户脚本中的变量联系起来的呢?也就是说,如果我在脚本中写下: ...

botkenni ⋅ 2016/10/11 ⋅ 0

深入理解PHP原理之变量作用域

作者:laruence(http://www.laruence.com/) 地址: http://www.laruence.com/2008/08/26/463.html PHP变量的内部表示是如何和用户脚本中的变量联系起来的呢?也就是说,如果我在脚本中写下: ...

晨曦之光 ⋅ 2012/03/09 ⋅ 0

PHP怎么声明全局变量

函数之外声明的变量拥有 Global 作用域,只能在函数以外进行访问。 函数内部声明的变量拥有 LOCAL 作用域,只能在函数内部进行访问。 <?php $a = 12; function var_global(){ echo $a; //结果...

程序猿小明 ⋅ 2014/07/31 ⋅ 0

引用计数基本知识 & PHP 的内存泄露

每个php变量存在一个叫"zval"的变量容器中。一个zval变量容器,除了包含变量的类型和值,还包括两个字节的额外信息。第一个 是"is_ref",是个bool值,用来标识这个变量是否是属于引用集合(re...

lg2045 ⋅ 2014/08/29 ⋅ 0

C语言和PHP语法相异点

C语言和PHP语法相异点技术 maybe yes 发表于2015-02-05 16:09 原文链接 : http://blog.lmlphp.com/archives/80 来自 : LMLPHP后院 PHP 的语法规则和 C 语言语法规则非常的相似,PHP 中很多内...

hosser ⋅ 2015/05/03 ⋅ 2

没有更多内容

加载失败,请刷新页面

加载更多

下一页

6.1 压缩打包介绍 6.2 gzip压缩工具 6.3 bzip2压缩工具 6.4 xz压缩工具

压缩打包介绍 使用压缩工具的好处: 使用压缩文件,不仅可以节省磁盘空间,而且在传输时还能节省网络宽带。 我们通常讲的家用宽带和机房宽带100M是有区别的: 机房宽带的上行和下行都是100M,...

Linux_老吴 ⋅ 23分钟前 ⋅ 0

SpringBoot热部署加持

概述 进行SpringBoot的Web开发过程中,我们很多时候经常需要重启Web服务器才能保证修改的 源代码文件、或者一些诸如xml的配置文件、以及一些静态文件生效,这样耗时又低效。所谓的热部署指的...

CodeSheep ⋅ 30分钟前 ⋅ 0

OSChina 周六乱弹 —— 假如你被熊困到树上

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @小小编辑:推荐歌曲《如果写不出好的和弦就该在洒满阳光的钢琴前一起吃布丁》 《如果写不出好的和弦就该在洒满阳光的钢琴前一起吃布丁》- 谢...

小小编辑 ⋅ 今天 ⋅ 5

vbs 取文件大小 字节

dim namedim fs, s'name = Inputbox("姓名")'msgbox(name)set fs = wscript.createobject("scripting.filesystemobject") 'fs为FSO实例if (fs.folderexists("c:\temp"))......

vga ⋅ 今天 ⋅ 1

高并发之Nginx的限流

首先Nginx的版本号有要求,最低为1.11.5 如果低于这个版本,在Nginx的配置中 upstream web_app { server 到达Ip1:端口 max_conns=10; server 到达Ip2:端口 max_conns=10; } server { listen ...

算法之名 ⋅ 今天 ⋅ 0

Spring | IOC AOP 注解 简单使用

写在前面的话 很久没更新笔记了,有人会抱怨:小冯啊,你是不是在偷懒啊,没有学习了。老哥,真的冤枉:我觉得我自己很菜,还在努力学习呢,正在学习Vue.js做管理系统呢。即便这样,我还是不...

Wenyi_Feng ⋅ 今天 ⋅ 0

博客迁移到 https://www.jianshu.com/u/aa501451a235

博客迁移到 https://www.jianshu.com/u/aa501451a235 本博客不再更新

为为02 ⋅ 今天 ⋅ 0

win10怎么彻底关闭自动更新

win10自带的更新每天都很多,每一次下载都要占用大量网络,而且安装要等得时间也蛮久的。 工具/原料 Win10 方法/步骤 单击左下角开始菜单点击设置图标进入设置界面 在设置窗口中输入“服务”...

阿K1225 ⋅ 今天 ⋅ 0

Elasticsearch 6.3.0 SQL功能使用案例分享

The best elasticsearch highlevel java rest api-----bboss Elasticsearch 6.3.0 官方新推出的SQL检索插件非常不错,本文一个实际案例来介绍其使用方法。 1.代码中的sql检索 @Testpu...

bboss ⋅ 今天 ⋅ 0

informix数据库在linux中的安装以及用java/c/c++访问

一、安装前准备 安装JDK(略) 到IBM官网上下载informix软件:iif.12.10.FC9DE.linux-x86_64.tar放在某个大家都可以访问的目录比如:/mypkg,并解压到该目录下。 我也放到了百度云和天翼云上...

wangxuwei ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部