免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2781 | 回复: 3
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(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
2 [报告]
发表于 2010-10-31 11:14 |只看该作者
php 5  对象默认就是引用传递了。

论坛徽章:
0
3 [报告]
发表于 2010-11-01 10:52 |只看该作者
php 5  对象默认就是引用传递了。
maochanglu 发表于 2010-10-31 11:14


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

论坛徽章:
0
4 [报告]
发表于 2010-11-04 10:08 |只看该作者
要用拷贝,使用clone
$obj2 = clone $obj;
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP