引用&符号详解

变量的引用

PHP 的引用允许你用两个变量来指向同一个内容。

例一:

<?php

$a="2010";

$b =&$a;

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

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

$b="2012";

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

echo $b;//这里输出2012

?>

例二:

<?php

$a = "date";

$b = &$a;

echo $a; // date

echo $b; // date

$b = "date1";

echo $a; // date1

echo $b; // date1

unset($a);

echo $b; // date1

?>

从上面的两个例子中,可以看出,把$b的内存地址给了$b,并不是简单的赋值。所以对$b

的任何操作也会影响到$a

另种说法,就是给$a增加了一个别名$b,如果删除了$a,只是删除了这个变量的名字,并没有删除变量的内容,用别名还是可以把这个变量的内容显示出来。(如图关系)

函数的传址调用

例三:

<?php

function test(&$a)

{

$a=$a+100;

}

$b=1;

echo $b;//输出1

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

test($b);  

echo $b;//输出101

?>

如何在这里test(1);的话就会出错,说明参数只能是变量,常量不具有传址。

函数的引用返回

函数的引用返回多用在对象中,这里方便理解 用静态变量做个例子

例四:

<?php

function &test()

{

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

    $b=$b+1;

    echo $b;

    return $b;

}

//这条语句会输出 $b的值 为1

$a=test();

$a=5;

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

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

$a=5;

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

注释,这个函数是有输出的,而且也有返回值的。

$a = test();只是将函数test的返回值$b赋给$a了,就是很普通的赋值而已,不是函数的引用返回。所以$a不管做什么操作,都不会影响$b。

$a = &test();作用就是 将$b的内存地址与$a的内存地址指向了同一个地方,会产生类似于$b = &$a的效果,如果$a的值改变了,即变成了5,也会影响$b的值。所以在执行$a = &test();$a = 5,就有$b = 5,经过函数处理输出$b = 6;

?>

以上代码是在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 永远是调用它的对象的引用。

另外说明

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

假如,有以下代码:

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

Ps:我个人认为这里应该是$b = &$a,才能使$a和$b指向同一内存地址,但是我参考的资料上面就是这么写的,目前我对&了解的还不是很深入,如果有朋友有不同见解的可以提出来,谢谢喽

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

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

$a="EFG";

这里进行“写”操作了

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

PHP 中引用的意思是:不同的名字访问同一个变量内容.

变量的引用

PHP 的引用允许你用两个变量来指向同一个内容

例一:

<?php

$a="2010";

$b =&$a;

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

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

$b="2012";

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

echo $b;//这里输出2012

?>

例二:

<?php

$a = "date";

$b = &$a;

echo $a; // date

echo $b; // date

$b = "date1";

echo $a; // date1

echo $b; // date1

unset($a);

echo $b; // date1

?>

从上面的两个例子中,可以看出,把$b的内存地址给了$b,并不是简单的赋值。所以对$b

的任何操作也会影响到$a

另种说法,就是给$a增加了一个别名$b,如果删除了$a,只是删除了这个变量的名字,并没有删除变量的内容,用别名还是可以把这个变量的内容显示出来。(如图关系)

函数的传址调用

例三:

<?php

function test(&$a)

{

$a=$a+100;

}

$b=1;

echo $b;//输出1

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

test($b);

echo $b;//输出101

?>

如何在这里test(1);的话就会出错

说明参数只能是变量,常量不具有传址。

函数的引用返回

函数的引用返回多用在对象中,这里方便理解 用静态变量做个例子

例四:

<?php

function &test()

{

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

$b=$b+1;

echo $b;

return $b;

}

//这条语句会输出 $b的值 为1

$a=test();

$a=5;

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

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

$a=5;

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

注释,这个函数是有输出的,而且也有返回值的。

$a = test();只是将函数test的返回值$b赋给$a了,就是很普通的赋值而已,不是函数的引用返回。所以$a不管做什么操作,都不会影响$b。

$a = &test();作用就是 将$b的内存地址与$a的内存地址指向了同一个地方,会产生类似于$b = &$a的效果,如果$a的值改变了,即变成了5,也会影响$b的值。所以在执行$a = &test();$a = 5,就有$b = 5,经过函数处理输出$b = 6;

?>

对象的引用

例五:

<?php

class a{

var $abc="ABC";

}

$b=new a;

$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 永远是调用它的对象的引用。

另外说明

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

假如,有以下代码:

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

Ps:我个人认为这里应该是$b = &$a,才能使$a和$b指向同一内存地址,但是我参考的资料上面就是这么写的,目前我对&了解的还不是很深入,如果有朋友有不同见解的可以提出来,谢谢喽

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

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

$a="EFG";

这里进行“写”操作了

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

时间: 2024-09-28 19:18:27

引用&符号详解的相关文章

PHP引用(&amp;)使用详解

PHP的引用(就是在变量或函数或对象或对象方法 等前面加上&符号) 在PHP 中引用的意思是:不同的名字访问同一个变量内容. 与C语言中的指针是有差别的.C语言中的指针里面存储的是变量的内容,在内存中存放的地址. 1.变量的引用 PHP 的引用允许你用两个变量来指向同一个内容. <? $a = "ABC"; $b = &$a; echo $a; //这里输出:ABC echo $b; //这里输出:ABC $b = "EFG"; echo $a

【转载】C++ 值传递、指针传递、引用传递详解

原文链接:http://www.cnblogs.com/yanlingyin/ 值传递: 形参是实参的拷贝,改变形参的值并不会影响外部实参的值.从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入, 不能传出.当函数内部需要修改参数,并且不希望这个改变影响调用者时,采用值传递. 指针传递: 形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作 引用传递: 形参相当于是实参的“别名”,对形参的操作其实就是对实参的操作,在引用传递过程中,被调函数的形式参数

正则表达式全部符号详解

字符 描述 \ 将下一个字符标记为一个特殊字符.或一个原义字符.或一个 向后引用.或一个八进制转义符.例如,'n' 匹配字符 "n".'\n' 匹配一个换行符.序列 '\\' 匹配 "\" 而 "\(" 则匹配 "(". ^ 匹配输入字符串的开始位置.如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的位置. $ 匹配输入字符串的结束位置.如果设置了RegExp 对象的 Mul

C++之引用&amp;的详解

C++中的引用: 引用引入了对象的一个同义词.定义引用的表示方法与定义指针相似,只是用&代替了*.引用(reference)是c++对c语言的重要扩充.引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样. 其格式为:类型 &引用变量名 = 已定义过的变量名. 引用的特点: ①一个变量可取多个别名. ②引用必须初始化. ③引用只能在初始化的时候引用一次 ,不能更改为转而引用其他变量. ①基础引用: void TestReference1 () { int a = 1;

传值赋值与引用赋值详解

1. 基础概念 传值赋值:当将一个表达式的值赋予一个变量时,整个原始表达式的值被赋予到目标变量.这意味着,例如,当一个变量的值赋予另一个变量时,改变其中一个变量的值,将不会影响到另一个变量. 引用赋值:这意味着新的变量简单的引用(换言之,“成为其别名” 或者 “指向”)了原始变量.改动新的变量将影响到原始变量,反之亦然. 1 <?php 2 $a = 'a'; 3 $b = 'b'; 4 echo "$a,$b<hr />"; 5 // 显示a,b 6 $b = $a

C++ 值传递、指针传递、引用传递详解

写在前头: 本文摘抄字博客:http://www.cnblogs.com/yanlingyin/archive/2011/12/07/2278961.html 自己的理解: 关于指针和引用的区别在于: 指针是对地址的一份拷贝,虽然对其的使用,可以通过地址来改变实参的值, 但如果对这个指针的拷贝,做出改变,那么这种改变将不影响实参. 而引用,是一种间接的操作,对形参的所有改变,都会通过间接的操作,映射到实参中,引用本身就是一种别名, 所以对这个别名的操作,就是对实参的操作. 还有一些其他的区别,就

Objective-C - ARC(Automatic Reference Counting)自动引用技术详解

ARC特点与判断准则 /* ARC的判断准则:只要没有强指针指向对象,就会释放对象 1.ARC特点 1> 不允许调用release.retain.retainCount 2> 允许重写dealloc,但是不允许调用[super dealloc] 3> @property的参数 * strong :成员变量是强指针(适用于OC对象类型) * weak :成员变量是弱指针(适用于OC对象类型) * assign : 适用于非OC对象类型 4> 以前的retain改为用strong 指针

大写“O”符号详解

通常您会开发一个测试数据库.它可能只供 10 人访问,所以你的编程和测试工作可以流畅地进行.一旦完成开发和 QA'd (通过质量检验),它将会正式上线(发布), 人们开始访问该网站.过了一年左右,该网站的响应速度越来越慢.在添加更多的数据库服务器没有起到作用后,您的系统管理员在my.cnf's度过了他的"假期", 甚至为系统新增了许多内存容量也无济于事.听起来像是在大批量访问网站的情况下程序(代码)结构制约了访问效果.系统对40000人的用户列表信息不能完成排序或处理,或者数组的元素超

Linux命令的特殊符号详解

Linux输入和输出中,会有>>,>和< >>和>都属于输出重定向,<属于输入重定向. >会覆盖目标的原有内容.当文件存在时会先删除原文件,再重新创建文件,然后把内容写入该文件:否则直接创建文件. >>会在目标原有内容后追加内容.当文件存在时直接在文件末尾进行内容追加,不会删除原文件:否则直接创建文件. 原文地址:https://www.cnblogs.com/HuangJiaPing/p/12625414.html