频道栏目
首页 > 资讯 > 引用 > 正文

PHP里的值传递与引用传递

16-01-06        来源:[db:作者]  
收藏   我要投稿

<p> PHP中存在着值传递和引用传递。后者需要使用地址符&amp;来标识变量。使用赋值操作举例说明如下: </p> <p> 1、值传递 </p> <p> 1)基本数据类型: </p> <p> &nbsp; </p> <div> <div> <div> <table> <tbody> <tr> <td> 01 </td> <td> &lt;?php </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 02 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;$a&nbsp;= 1; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 03 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;$b&nbsp;=&nbsp;$a; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 04 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;$b&nbsp;+= 2; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 05 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 06 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;"\$a = ".$a."&lt;br /&gt;"; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 07 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;"\$b = ".$b."&lt;br /&gt;"; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 08 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 09 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;/* 输出: </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 10 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$a = 1 </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 11 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$b = 3 </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 12 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;*/ </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 13 </td> <td> ?&gt; </td> </tr> </tbody> </table> </div> </div> </div> <p> &nbsp; </p> <p> 注:这里使用了$b = $a语句,是将$a的值赋给了$b。&nbsp;即此时赋的值是1。&nbsp;&nbsp;<br /> <a href=/uploadfile/2016/0106/20160106051449149.png" target="_blank"><img alt="\" src=/uploadfile/2016/0106/20160106051449149.png" /></a>&nbsp;<br /> 执行语句$b += 2后:&nbsp;<br /> <a href=/uploadfile/2016/0106/20160106051449859.png" target="_blank"><img alt="\" src=/uploadfile/2016/0106/20160106051449859.png" /></a> </p> <br /> <p> 所以,$b变成了3,但是$a的值并没有改变。 </p> <p> 2)引用数据类型 </p> <p> Person类如下: </p> <div> <div> <div> <table> <tbody> <tr> <td> 01 </td> <td> class&nbsp;Person { </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 02 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;$_name; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 03 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 04 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;setName($name) { </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 05 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;_name =&nbsp;$name; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 06 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;} </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 07 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 08 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;getName() { </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 09 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$this-&gt;_name; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 10 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;} </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 11 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 12 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;toString() { </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 13 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;"name is ".$this-&gt;_name; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 14 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;} </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 15 </td> <td> } </td> </tr> </tbody> </table> </div> </div> </div> <p> &nbsp; </p> <p> 初始化两个Person类对象,并设置属性: </p> <p> &nbsp; </p> <div> <div> <div> <table> <tbody> <tr> <td> 1 </td> <td> $p1&nbsp;=&nbsp;new&nbsp;Person(); </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 2 </td> <td> $p1-&gt;setName("person1"); </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 3 </td> <td> $p2&nbsp;=&nbsp;new&nbsp;Person(); </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 4 </td> <td> $p2-&gt;setName("person2"); </td> </tr> </tbody> </table> </div> </div> </div> <p> &nbsp; </p> <p> 执行以下操作: </p> <p> &nbsp; </p> <div> <div> <div> <table> <tbody> <tr> <td> 1 </td> <td> $p3&nbsp;=&nbsp;$p1; </td> </tr> </tbody> </table> </div> </div> </div> <p> &nbsp; </p> <p> 测试: </p> <p> &nbsp; </p> <div> <div> <div> <table> <tbody> <tr> <td> 1 </td> <td> echo&nbsp;"\$p1's ".$p1-&gt;toString().".&lt;br /&gt;"; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 2 </td> <td> echo&nbsp;"\$p3's ".$p3-&gt;toString().".&lt;br /&gt;"; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 3 </td> <td> &nbsp; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 4 </td> <td> /* 输出: </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 5 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;$p1's name is person1. </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 6 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;$p3's name is person1. </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 7 </td> <td> */ </td> </tr> </tbody> </table> </div> </div> </div> <p> &nbsp; </p> <p> 注:&nbsp;对于&nbsp;$p3 = $p1语句,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;即此时赋的值是0x000a。&nbsp;&nbsp;即$p1和$p3都引用了同一个对象。&nbsp; </p> <br /> <p> <a href=/uploadfile/2016/0106/20160106051449630.png" target="_blank"><img alt="\" src=/uploadfile/2016/0106/20160106051449630.png" /></a> </p> <p> 2、引用传递 </p> <p> 1)基本数据类型 </p> <p> &nbsp; </p> <div> <div> <div> <table> <tbody> <tr> <td> 01 </td> <td> &lt;?php </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 02 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;$a&nbsp;= 1; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 03 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;$b&nbsp;= &amp;$a; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 04 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;$b&nbsp;+= 2; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 05 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 06 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;"\$a = ".$a."&lt;br /&gt;"; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 07 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;"\$b = ".$b."&lt;br /&gt;"; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 08 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 09 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;/* 输出: </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 10 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$a = 3 </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 11 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$b = 3 </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 12 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;*/ </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 13 </td> <td> ?&gt; </td> </tr> </tbody> </table> </div> </div> </div> <p> &nbsp; </p> <p> 注:这里使用$b = &amp;$a语句,进行了引用传递:&nbsp;&nbsp;&nbsp;即此时赋的值是0x0001。&nbsp;&nbsp;<br /> <a href=/uploadfile/2016/0106/20160106051449324.png" target="_blank"><img alt="\" src=/uploadfile/2016/0106/20160106051449324.png" /></a> </p> <br /> <p> &nbsp; </p> <p> &nbsp; </p> <p> &nbsp; </p> <p> 所以对$b += 2后, </p> <p> <a href=/uploadfile/2016/0106/20160106051449431.png" target="_blank"><img alt="\" src=/uploadfile/2016/0106/20160106051449431.png" /></a> </p> <p> 所以$a和$b的值都是3。 </p> <p> 2)引用数据类型 </p> <p> 若执行的是以下操作来替代之前的$p3 = $p1 </p> <p> &nbsp; </p> <div> <div> <div> <table> <tbody> <tr> <td> 1 </td> <td> $p3&nbsp;= &amp;$p1; </td> </tr> </tbody> </table> </div> </div> </div> <p> &nbsp; </p> <p> 再执行以下操作: </p> <p> &nbsp; </p> <div> <div> <div> <table> <tbody> <tr> <td> 1 </td> <td> $p3&nbsp;=&nbsp;$p2; </td> </tr> </tbody> </table> </div> </div> </div> <p> &nbsp; </p> <p> 测试结果如下: </p> <p> &nbsp; </p> <div> <div> <div> <table> <tbody> <tr> <td> 1 </td> <td> echo&nbsp;"\$p1's ".$p1-&gt;toString().".&lt;br /&gt;"; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 2 </td> <td> echo&nbsp;"\$p3's ".$p3-&gt;toString().".&lt;br /&gt;"; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 3 </td> <td> &nbsp; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 4 </td> <td> /* 输出: </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 5 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;$p1's name is person2. </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 6 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;$p3's name is person2. </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 7 </td> <td> */ </td> </tr> </tbody> </table> </div> </div> </div> <p> &nbsp; </p> <p> 注:对已打印出$p3的结果信息是很明了的,因为执行了$p3 = $p2语句,但是为什么打印$p1的结果信息与之前相比不一样了呢? </p> <p> 是因为$p3 = &amp;$p1语句执行后,&nbsp;&nbsp;即此时赋的值是0x0001。&nbsp;<br /> <a href=/uploadfile/2016/0106/20160106051449848.png" target="_blank"><img alt="\" src=/uploadfile/2016/0106/20160106051449848.png" /></a> </p> <p> &nbsp; </p> <p> 紧接着执行$p3 = $p2语句后<br /> <a href=/uploadfile/2016/0106/20160106051449201.png" target="_blank"><img alt="\" src=/uploadfile/2016/0106/20160106051449201.png" /></a> </p> <p> &nbsp; </p> <p> &nbsp; </p> <p> 所以才会打印出如上的结果信息,这便是地址符&amp;在起作用。 </p> <p> 完整代码如下: </p> <p> 1)引用数据类型 </p> <p> &nbsp; </p> <div> <div> <div> <table> <tbody> <tr> <td> 01 </td> <td> &lt;?php </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 02 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;class&nbsp;Person { </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 03 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;$_name; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 04 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 05 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;setName($name) { </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 06 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;_name =&nbsp;$name; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 07 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 08 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 09 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;getName() { </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 10 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$this-&gt;_name; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 11 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 12 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 13 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;toString() { </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 14 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;"name is ".$this-&gt;_name; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 15 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 16 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;} </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 17 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 18 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;$p1&nbsp;=&nbsp;new&nbsp;Person(); </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 19 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;$p1-&gt;setName("person1"); </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 20 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;$p2&nbsp;=&nbsp;new&nbsp;Person(); </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 21 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;$p2-&gt;setName("person2"); </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 22 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 23 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;$p3&nbsp;=&nbsp;$p1; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 24 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;// $p3 = &amp;$p1; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 25 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;// $p3 = $p2; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 26 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;"\$p1's ".$p1-&gt;toString().".&lt;br /&gt;"; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 27 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;"\$p3's ".$p3-&gt;toString().".&lt;br /&gt;"; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 28 </td> <td> ?&gt; </td> </tr> </tbody> </table> </div> </div> </div> <p> &nbsp; </p> <p> 2)基本数据类型 </p> <p> &nbsp; </p> <div> <div> <div> <table> <tbody> <tr> <td> 1 </td> <td> &lt;?php </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 2 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;$a&nbsp;= 1; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 3 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;$b&nbsp;=&nbsp;$a; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 4 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;// $b = &amp;$a; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 5 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;$b&nbsp;+= 2; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 6 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 7 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;"\$a = ".$a."&lt;br /&gt;"; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 8 </td> <td> &nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;"\$b = ".$b."&lt;br /&gt;"; </td> </tr> </tbody> </table> </div> <div> <table> <tbody> <tr> <td> 9 </td> <td> ?&gt; </td> </tr> </tbody> </table> </div> </div> </div> <p> &nbsp; </p> <p> &nbsp; </p> <p> 结束语:对于值传递与引用传递在方法/函数参数的传递上情况下,与赋值操作情况是类似的。 </p> <!--内容关联投票-->  

相关TAG标签
上一篇:PHP基础篇之代码重用和文件引用
下一篇:应用PHP的日期与时间函数提高开发技巧
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站