`
crystalwiner
  • 浏览: 88713 次
  • 性别: Icon_minigender_2
  • 来自: 深圳
社区版块
存档分类
最新评论

PHP之引用

    博客分类:
  • php
阅读更多

    所谓PHP的引用,就是不同的名字访问同一个变量内容。可用在变量、函数以及对象上,用法就是在它们前面加上&符号。下面来细说下引用的类型及作用:

 

一、引用类型

1.1、变量引用: 两个变量指向同一个内容

<?php
  $a = "abc"; 
  $b = &$a; 
  echo $a;//这里输出:abc 
  echo $b;//这里输出:abc 
  
  $b = "done"; 
  echo $a;//这里$a的值变为done, 所以输出done 
  echo $b;//这里输出done
?> 


1.2、函数传址引用

function test(&$a)
{
	$a=$a+100; 
}

$b=1;

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

echo $b;//输出101 
 

要注意的是,在这里test(1); 的话就会出错,原因自己去想

1.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而已, 而$a做任何改变都不会影响到函数中的$b, 而通过$a=&test()方式调用函数呢, 他的作用是将return $b中的$b变量的内存地址与$a变量的内存地址 指向了同一个地方, 即产生了相当于这样的效果($a=&b;) 所以改变$a的值, 也同时改变了$b的值, 所以在执行了


$a=&test();
$a=5;


以后,$b的值变为了5

这里是为了方便理解函数的引用返回才使用静态变量,其实函数的引用返回多用在对象中

 

1.4、对象的引用

class testa
{
	var $abc="ABC"; 
}

$b=new testa;
$c = &$b; // or $c = $b;
echo $b->abc;//这里输出ABC 
echo $c->abc;//这里输出ABC 
$b->abc="DEF"; 
echo $c->abc;//这里输出DEF 
 

以上代码是在PHP5中的运行效果;
在PHP5中,对象的复制 是通过引用来实现的。上例中$b=new a; $c=$b; 其实等效于$b=new a; $c=&$b;
PHP5中默认就是通过引用来调用对象, 但有时你可能想建立一个对象的副本,并希望原来的对象的改变不影响到副本。 为了这样的目的,PHP定义了一个特殊的方法,称为__clone.

二、引用的作用


如果程序比较大,引用同一个对象的变量比较多,并且希望用完该对象后手工清除它,个人建议用 "&" 方式,然后用$var=null的方式清除。其它时候还是用php5的默认方式吧。另外, php5中对于大数组的传递,建议用 "&" 方式, 毕竟节省内存空间使用。

三、取消引用


当你 unset 一个引用,只是断开了变量名和变量内容之间的绑定。这并不意味着变量内容被销毁了。例如:

<?php
   $a = 1;
   $b =& $a;
   unset ($a);
?>

不会 unset $b,只是销毁了 $a。

再如global 引用,当用 global $var 声明一个变量时实际上建立了一个到全局变量的引用。也就是说和这样做是相同的:

<?php
    $var =& $GLOBALS["var"];
?>

这意味着,例如,unset $var 不会 unset 全局变量。

$this 的引用:在一个对象的方法中,$this 永远是调用它的对象的引用。

 

PS:

PHP有个好处就是可利用其拥有的自动垃圾回收机制(释放内存)。即不需要在使用完变量后做任何释放内存的处理,PHP会帮你完成。当然,我们可以按自己的意愿调用 unset() 函数来释放内存,但通常不需要这么做。


不过在PHP里,至少有一种情况内存不会得到自动释放,如下面:


如果两个对象之间存在着相互引用的关系,如“父对象-子对象”,对父对象调用 unset()不会释放在子对象中引用父对象的内存(即便父对象被垃圾回收,也不行)。


这个时候,即便是手动调用 unset()。详情可考:http://bugs.php.net/bug.php?id=33595

折中的办法是在 unset() 函数中调用对象中的 __destruct() 方法;

 

 

------------------------------------------------------------------------------------

补充:


php中对于地址的指向(类似指针)功能不是由用户自己来实现的,是由Zend核心实现的,php中引用采用的是“写时拷贝”的原理,就是除非发生写操作,指向同一个地址的变量或者对象是不会被拷贝的。

通俗的讲
1:如果有下面的代码

$a="ABC";
$b=$a;

其实此时,$a与$b都是指向同一内存地址,而并不是$a与$b占用不同的内存

2:如果在上面的代码基础上再加上如下代码

$a="EFG";

由于$a与$b所指向的内存的数据要重新写一次了,此时Zend核心会自动判断,自动为$b生产一个$a的数据拷贝,重新申请一块内存进行存储。

分享到:
评论

相关推荐

    php中关于引用(&)详解.docx

    php中关于引用(&)详解 php中关于引用(&)详解 php中关于引用(&)详解

    PHP的引用详解

    在 PHP 中引用意味着用不同的名字访问同一个变量内容。这并不像 C 的指针,替代的是,引用是符号表别名。注意在 PHP 中,变量名和变量内容是不一样的,因此同样的内容可以有不同的名字。最接近的比喻是 Unix 的...

    PHP—引用文件.docx

    PHP—引用文件.docx

    PHP变量引用(&amp;)、函数引用和对象引用_.docx

    PHP变量引用(&amp;)、函数引用和对象引用_.docx

    php中引用&的用法分析【变量引用,函数引用,对象引用】

    本文实例分析了php中引用&的用法。分享给大家供大家参考,具体如下: php的引用(就是在变量或者函数、对象等前面加上&符号) //最重要就是 删除引用的变量 ,只是引用的变量访问不了,但是内容并没有销毁 在PHP 中...

    PHP7扩展向PHP添加了SoftandWeak引用支持

    PHP 7扩展,向PHP添加了Soft and Weak引用支持

    PHP 基础实例教程(PHP网页实例版)

    PHP变量自增/减与变量引用 PHP 比较操作符 PHP 逻辑操作符 PHP 三元操作符 PHP 错误抑制操作符 PHP 执行操作符 PHP 数组操作符 PHP 操作符综合使用 PHP 条件判断/循环 PHP if语句 PHP else语句 PHP elseif语句 PHP ...

    php 传值赋值与引用赋值的区别

    传值赋值:当将一个表达式的值赋予一个... 引用赋值:新的变量简单的引用了原始变量,改变新的变量将影响到原始变量使用引用赋值,简单地将一个&符号加到将要赋值的变量前(源变量) 类型戏法PHP 在变量定义中不需要

    一道关于php变量引用的面试题

    php面试题题目如下: 复制代码 代码如下: &lt;... 您可能感兴趣的文章:PHP中函数内引用全局变量的方法浅谈PHP变量作用域以及地址引用问题PHP中变量引用与变量销毁机制分析浅谈PHP中关于foreach使用引用变量的坑

    php地址引用(php地址引用的效率问题)

    复制代码 代码如下: &lt;?php echo ‘begin time:’.$begin=microtime(false).' ’;//begin to count time $array=array();...//地址引用 时间总是控制在0.01之内 地址引用的优势体现出来了 forea

    PHP中文教程:PHP面向对象语法(构造函数、析构函数、引用)

    PHP面向对象语法 讲解了构造函数 析构函数 引用及引用传递

    php引用返回与取消引用的详解

    一、引用返回引用返回用在当想用函数找到引用应该被绑定在哪一个变量上面时。不要用返回引用来增加性能,引擎足够聪明来自己进行优化。仅在有合理的技术原因时才返回引用!要返回引用,使用此语法:复制代码 代码...

    php调用jar包依赖包

    php调用jar包依赖包

    腾讯PHP面试题_腾讯php面试题_

    PHP 使用了引用计数 (reference counting) GC 机制。 每个对象都内含一个引用计数器 refcount,每个 reference 连接到对象,计数器加 1。当 reference 离开生存空间或被设为 NULL,计数器减 1。当某个对象的引用...

    php调用图片

    php程序 后台输入文字或者编号调用图片php程序 后台输入文字或者编号调用图片php程序 后台输入文字或者编号调用图片php程序 后台输入文字或者编号调用图片php程序 后台输入文字或者编号调用图片php程序 后台输入文字...

    深入解析PHP的引用计数机制

    本篇文章是对PHP中的引用计数机制进行了详细的分析介绍,需要的朋友参考下

    谨慎使用PHP的引用原因分析

    引用类型(Reference)在许多计算机语言中都被使用,...PHP中也引入了引用类型,在对对象赋值传递上,基本可视为是同于Java/C#的引用传递(具体请见Objects and references)。但同时又支持在基础类型上通过引用运算符

    SQL Server Driver for PHP 3.0 rar格式

    3)在php ini配置文件内引用相应的动态链接库文件 extension php sqlsrv 52 ts vc6 dll extension php pdo sqlsrv 52 ts vc6 dll extension php pdo dll 4 重启Apache 5 连接数据库"&gt;本人提供的是 rar格式 ...

    计算机后端-全面解读PHP面试-识考察点PHP引用变量考察点(下).mp4

    计算机后端-全面解读PHP面试-识考察点PHP引用变量考察点(下).mp4

Global site tag (gtag.js) - Google Analytics