作用域的概念:

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

主要的常用的包括:局部变量、全局变量、静态变量。

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

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

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

function test()

{

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

$b=$b+1;

echo $b;

}

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

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

注:static $b=0 这一赋值操作只会在变量第一次被初始化的时候执行。

附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 "
";

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的数据拷贝,重新申请一块内存进行存储。

地址引用PHP,浅谈PHP变量作用域以及地址引用问题相关推荐

  1. 浅谈List保存的数据是引用数据类型的地址

    浅谈List保存的数据是引用数据类型的地址 今天一个初学javaweb的朋友问我一个bug,经过和别人 讨论分析了解到List对象细节上的一些问题,我将代码重新简化构造了一下做成了一个例子.上代码: ...

  2. java 静态变量回收_浅谈静态变量的回收问题

    今天工作中遇到一个用于缓存数据到内存的静态变量Stringbuffer:当缓存数据大小达到5M的时候就把该缓存数据写到S3上:然后清空该缓存buffer;看了这段代码我觉得是不是有点问题:先贴大概的代 ...

  3. java继承和引用_浅谈Java继承、传递

    一.继承 1. 继承的概念: 子类继承父类,表明子类是一种特殊的父类,并且具有父类所不具有的一些属性或方法. 2. 继承中的初始化顺序: 从类的结构上而言,其内部可以有如下四种常见形态:属性(包括类属 ...

  4. 浅谈JavaScript 函数作用域当中的“提升”现象

    在JavaScript当中,定义变量通过var操作符+变量名.但是不加 var 操作符,直接赋值也是可以的. 例如 : message = "hello JavaScript ! " ...

  5. java 变量初始化_浅谈Java变量的初始化顺序详解

    规则1(无继承情况下):对于静态变量.静态初始化块.变量.初始化块.构造器,它们的初始化顺序依次是 (静态变量.静态初始化块)>(变量.初始化块)>构造器 证明代码: public cla ...

  6. 变量在linux中的作用是什么意思,浅谈linux变量

    1.什么是变量 一句话:变量即在程序运行过程中它的值是允许改变的量. 2.变量作用 1数据的存储格式 2参与的运算 3表示的数据范围 3.变量命名规则 1 命名要见名知意(命名的时候一定要注意,不能随 ...

  7. python一个对象只能被一个变量引用吗_Python中的变量、对象、引用

    很多编程语言都有所谓的引用,对象,变量等概念.这些概念在强类型的语言中貌似并不是那么的重要,但是在动态类型的语言中,还是值得去仔细思考一下的 什么是变量 对于变量,在数学中我们已经了解过,就是一个值可 ...

  8. 浅谈单片机中变量访问的互斥

    本文以stm32为硬件平台,浅谈一下变量访问的互斥. 假设是裸板,主程序和中断服务程序都对某个变量进行修改,那么很可能造成数据的不一致.查了一下,主要有两种解决方法:第一种是关中断,在访问公共资源的时 ...

  9. 浅谈JVM(六):方法调用过程

    上一篇: 浅谈JVM(一):Class文件解析 浅谈JVM(二):类加载机制 浅谈JVM(三):类加载器和双亲委派 浅谈JVM(四):运行时数据区 浅谈JVM(五):虚拟机栈帧结构 6.方法调用过程 ...

最新文章

  1. 研发协作Scrum看板工具项目管理团队协通敏捷开发平台
  2. 024_jdbc-mysql的Dao模式
  3. 微软自拍:让黑科技拯救不会拍照的你
  4. 根据表中的时间戳字段统计每天数据的数量
  5. 网工基础测试题(附HCIA题库)
  6. 利用 NGINX 最大化 Python 性能,第二部分:负载均衡和监控
  7. 熊猫烧香演神话——在Windows mobile手机中运行
  8. eZ Publish 的 Site.INI文件的中文翻译
  9. linux 内核任务调度,Linux任务调度
  10. oracle的declare声明语法
  11. unity动画实现物体颜色闪烁
  12. jquery实现进度条
  13. nginx代理图片服务器
  14. 详解JAVA实现支付宝接口编程
  15. matlab加停顿,求高手解释下这段程序,实在是搞不懂了,要死的节奏了。。。。...
  16. Java实现数据排序
  17. 格兰杰因果 / EEG脑电数据分析
  18. 谷歌牵手265解密:双方将合作推广Adsence
  19. Unity中根据设备名称获取串口号
  20. hex文件、out文件、bin文件、map文件解析

热门文章

  1. python输入球的半径_基于用户输入半径的Myro移动机器人
  2. 思科isis路由的优先级_何谓“路由” ,带你了解路由的本质,轻松配置路由简单排除故障...
  3. 数据结构 线性表java_java数据结构--线性表
  4. python数组和列表_Python-01矩阵、数组和列表等的总结
  5. cli3 px转rem适配移动端_Vue:将px转化为rem,适配移动端
  6. ros订阅相机深度信息_一起做ROS-DEMO系列 (2):基于find_object_2d的目标匹配识别
  7. 皮一皮:感受下什么叫瑟瑟发抖的寒冬...
  8. 用了这么多年 curl,竟然不知道还有这种用法?!
  9. 成为阿里 P7 真的难么?
  10. 每日一皮:多线程理想与现实的差距