免费注册 查看新帖 |

Chinaunix

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

[引用]关于引用的解释 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-12-02 01:02 |只看该作者 |倒序浏览
谈谈引用。大家都听说过,引用不是指针,不过可能不是很透彻的理解这句话。再来解释一下吧。

在讨论这个问题之前,强烈建议最好看看 http://bbs.chinaunix.net/viewthr ... &extra=page%3D1 这篇文章来了解一下$i++的具体解释。

先上代码:
  1. $a = 1;
  2. $b = &$a;
  3. $b = $a++;
  4. echo "a: $a \nb: $b";
复制代码


你将会发现 $a 和 $b 都是 1!按照已经理解的++问题所说,应该是2才对啊!怎么解释呢?其实解释很简单,就是++操作丢了。听起来不可思议,其实不难理解。这里面跟++已经没有什么关系了,完全是'引用'这个东西在指使。

首先,php的变量并不包含值,他指向一个已经构建完毕的对象。例如 $s = "something";,这时候something被存储在一个特定的地方,$s只是包含"something"这个对象的一个记录,通过这个记录,我们可以找到something。当 $sr = &$s 的时候,并不代表 $sr 指向 $s,而是说 $sr 和 $s 指向的是同一个对象,也就是something只有一份,但是有两个变量引用他。当没有任何变量来记录something的信息的时候,something这个对象所占用的内存就被回收清理。
所以,改变了$s这个变量的值为"nothing",就是改变了 something为"nothing",而$sr也指向原来的something,自然而然的取$sr的值的时候,取到的是"nothing"。
不知道说明白没有。回头我们来看这段代码
-->>> $b = &$a
这句话的意思是:$b指向的对象现在跟 &$a 指向的对象是同一个东西,都指向了 1。
-->>> $b = $a++
由于改变了一个变量的值其实就是改变了他所指向的那个对象,又由于当变量$i发生后++的情况时,并不进行+1运算,而是在被++之后仅仅记录++操作,下一次取$i值的时候再+1返回,所以$a++的时候,记录了这个++运算,然后返回一个1,这时b和a指向的都是通过$a返回的1这个对象
奥妙就在这里面——先在1这个对象里面记录++运算,然后通过给$b赋值这个操作,又将单纯的对象1放到已经记录了++运算的对象1那个地方,所以曾经记录过++运算的对象1已经被替换为了单纯的对象1,所以再取值的时候,根本就是单纯的1,而不是“需要+1的1”了


其实在php里面,任何东西都可以理解为对象,无论是1 2 3 4 5这类数字,还是"a","b","c"这类字符串,只不过表现得不像python那么明显。

(文中“当变量$i发生后++的情况时,并不进行+1运算,而是在被++之后仅仅记录++操作,下一次取$i值的时候再+1返回”仅仅是为了便于理解,实际情况是post increment/decrement的时候先返回一个结果对象再在操作数上面作运算)

[ 本帖最后由 geel 于 2005-12-2 11:34 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2005-12-02 02:00 |只看该作者
$i++;
当变量$i发生后++的情况时,并不进行+1运算,而是在被++之后仅仅记录++操作,下一次取$i值的时候再+1返回

是这样的么? 如真像你说的这样,那么下面当执行到echo "start"; 时 $i 的值应该为 1, 在 echo $i; 的时候再自加1.

然而用Zend 作单步调试 在echo "start"; 时$i的只已经为2了

  1. $i = 1;
  2. $i++;
  3. echo "start"; //
  4. echo $i;
复制代码


根据上面调试验证, 你的说法不成立!

$b = $a++;
这句看来是, 先返回 $a 的值, 然后再 $a 自加, 最后 将返回值赋给$b
是这样么?

[ 本帖最后由 MayerCN 于 2005-12-2 16:25 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2005-12-02 08:09 |只看该作者
如果 increment 不是发生在赋值语句中,那么 pre 和 post 都是一样的。
即:

<?php
$i = 1;
$i++;
?>



<?php
$i = 1;
++$i;
?>

效果是一样的。只不过 ++$i 性能高一些。

而且有如

$a = 1;
$b = &$a;
$b = $a++;

这种语句在 C++ 等语言中应该是不成立的,因为在取值的同时又在改变值。记得有一个 C++ 的帖子说在 C++ 中:

foobar(a, a++)

这种语句是不能执行的。

论坛徽章:
0
4 [报告]
发表于 2005-12-02 08:53 |只看该作者
请按你的说法解释一下
$a = 1;
$b =& $a;
$b = $a;
$a++;
echo "a=$a b=$b";//a=2 b=2

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
5 [报告]
发表于 2005-12-02 09:12 |只看该作者
楼主分析的很精彩。好贴。

MayerCN 和xuzuning
我觉得你们看得还不够仔细。

论坛徽章:
0
6 [报告]
发表于 2005-12-02 09:33 |只看该作者
好贴?好什么呢?
好在想出种种理由来证明一个明显的错误是应该存在的吗?

难道
$b =& $a;
$b = $a++;
中的++运算被忽略了是正常的吗?
如果++运算可在某些场合下失效,那么还要他干什么?

论坛徽章:
0
7 [报告]
发表于 2005-12-02 09:51 |只看该作者
是不是这样....


$b = $a++;
等于如下解释:

  1. $obj=$a;

  2. $a++;

  3. $b = $a;

  4. $b = $obj;
复制代码

[ 本帖最后由 hitty 于 2005-12-2 09:52 编辑 ]

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
8 [报告]
发表于 2005-12-02 09:54 |只看该作者
原帖由 xuzuning 于 2005-12-2 09:33 发表
好贴?好什么呢?
好在想出种种理由来证明一个明显的错误是应该存在的吗?

难道
$b =& $a;
$b = $a++;
中的++运算被忽略了是正常的吗?
如果++运算可在某些场合下失效,那么还要他干什么?


请注意:
$b = $a++;

$a++;
$b = $a;
是完全不同的两回事.

论坛徽章:
0
9 [报告]
发表于 2005-12-02 10:38 |只看该作者
不错
$b = $a++;

$a++;
$b = $a;
是完全不同的两回事

但是我说的是
$a = 1;
$b =& $a;
$b = $a;
$a++;
echo "a=$a b=$b";//a=2 b=2

难道
$b = $a++;

$b = $a;
$a++;
不是一回事吗?
噢,到了引用就变了。这正常吗?这合理吗?

要是再多几个这样的“合理”,还有人敢用php吗?

论坛徽章:
0
10 [报告]
发表于 2005-12-02 11:25 |只看该作者
如果放在一起你看得迷糊的话,把他分开应该不迷糊了吧?

$a = 1;
$b = &$a;
$a++;
$b = 1;
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP