免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2404 | 回复: 3

PHP4中常见的引用用法在PHP5中引发的不兼容!! [复制链接]

论坛徽章:
0
发表于 2010-10-30 23:34 |显示全部楼层
本帖最后由 hightman 于 2010-10-30 23:43 编辑

直接看代码吧,以下代码预期应该是输出 2,3,4 的 value 但,事与原违。。。(环境 php5.3.3)

  1. <?php
  2. class bar
  3. {
  4.         public $value = 0;

  5.         function &ins() {
  6.                 if (!isset($this))
  7.                 {
  8.                         $obj = new bar;
  9.                         $obj->value = 1;
  10.                         return $obj;
  11.                 }
  12.                 return $this;
  13.         }

  14.         public function __toString() {
  15.                 return "value is: $this->value\n";
  16.         }
  17. }

  18. function foo()
  19. {
  20.         static $obj = null;
  21.         if (is_null($obj)) {
  22.                 $obj =  &bar::ins();
  23.         }
  24.         $obj->value++;
  25.         echo $obj;
  26. }

  27. foo();
  28. foo();
  29. foo();

复制代码
早期PHP4对像返回会变成拷贝,所以通过函数定义及调用时加&来作引用,不过PHP5开始就改变了,对像在函数返回值或各种赋值时均指向同一实例。
结果今天在弄一个旧代码时发现这个用法反而导致了大问题,原本 static 的预期效果不见了。

论坛徽章:
0
发表于 2010-10-31 11:14 |显示全部楼层
php 5  对象默认就是引用传递了。

论坛徽章:
0
发表于 2010-11-01 10:52 |显示全部楼层
php 5  对象默认就是引用传递了。
maochanglu 发表于 2010-10-31 11:14


准确的讲应该不叫引用传递,而是内部实际指向同一实例。"引用“在PHP中是一个比较特殊的东西。

论坛徽章:
0
发表于 2010-11-04 10:08 |显示全部楼层
要用拷贝,使用clone
$obj2 = clone $obj;
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

基于案例的 SQL 优化实战训练营

讲师:中电福富特级专家梁敬彬,参与本次课程培训,你将收获:
1. 能编写出较为高效的 SQL;
2. 能解决70%以上的数据库常见优化问题;
3. 能得到老师提供的高效的相关工具和解决方案;
4. 能举一反三,收获不仅仅是 SQL 优化。
现在购票享受8.8折优惠!
----------------------------------------
优惠时间:2019年3月20日前

大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP