当前位置:  编程技术>php

浅谈PHP变量作用域以及地址引用问题

    来源: 互联网  发布时间:2014-08-26

    本文导语:  作用域的概念: 在PHP脚本的任何位置都可以声明变量,但是,声明变量的位置会大大影响访问变量的范围。这个可以访问的范围称为作用域。 主要的常用的包括:局部变量、全局变量、静态变量。 1、局部变量:就是在函数内...

作用域的概念:

在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中检测变量是否是一个对象的is_object函数介绍及用法举例
  • PHP 超全局变量库 superGlobals
  • PHP变量的定义、可变变量、变量引用、销毁方法
  • PHP static局部静态变量和全局静态变量总结
  • 怎么样在JSP中使用PHP的变量呀??
  • PHP判断变量是否为0的方法
  • php中的静态变量的基本用法
  • PHP内核探索:变量概述
  • php 获取一个变量名字的二种方法
  • PHP中session变量的销毁
  • PHP的变量类型和作用域详解
  • PHP extract 数组拆分成多个变量
  • php使用json_encode对变量json编码
  • PHP变量作用域与地址引用问题解析
  • PHP服务器变量$_SERVER用法详解
  • PHP代码优化之成员变量获取速度对比
  • PHP源码分析之变量的存储过程分解
  • PHP标记风格、注释、表单获取、字符串类型、变量解析的实例解析
  • php获取当前url路径 php服务器变量
  • PHP 面向对象程序设计(oop)学习笔记 (二) - 静态变量的属性和方法及延迟绑定
  • PHP的error_reporting错误级别变量对照表
  • PHP、Nginx、Apache中禁止网页被iframe引用的方法
  • PHP的foreach中使用引用时需要注意的一个问题和解决方法
  • php引用字符串常量方法详解
  • php正则表达式的模式修正符和逆向引用使用介绍
  • PHP引用(&)各种使用方法实例详解
  • PHP正则表达式的逆向引用与子模式分析
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • PHP return语句的另一个作用
  • PHP extract(数组拆分)作用分析
  • PHP将回调函数作用到给定数组单元的方法
  • php中函数前加&符号的作用分解
  • php页面最大执行时间 set_time_limit函数不起作用
  • 修改配置真正解决php文件上传大小限制问题(nginx+php)
  • IIS7配置PHP图解(IIS7+PHP_5.2.17/PHP_5.3.5)
  • PHP 5.4.19 和 PHP 5.5.3 发布及下载地址
  • php输入流php://input使用示例(php发送图片流到服务器)
  • 修改配置真正解决php文件上传大小限制问题(apache+php)
  • PHP转换器 HipHop for PHP
  • PHP去除html标签,php标记及css样式代码参考
  • PHP 框架 Pop php
  • PHP 'ext/soap/php_xml.c'不完整修复存在多个任意文件泄露漏洞
  • PHP的JavaScript框架 PHP.JS
  • php通过socket_bind()设置IP地址代码示例
  • php服务器探针显示php服务器信息
  • php安装完成后如何添加mysql扩展
  • PHP缓存加速器 Alternative PHP Cache (APC)
  • PHP的substr() 函数用法
  • PHP源文件加密工具 PHP Screw
  • PHP介绍及学习网站推荐
  • PHP自动化测试 PHP-QAT
  • php中操作memcache的类及成员列表及php下如何连接memched服务器
  • PHP 的 HTTP 客户端库 PHP Buzz
  • php中内置的mysql数据库连接驱动mysqlnd简介及mysqlnd的配置安装方式
  • PHP 调试工具 PHP_Dyn


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3