加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 对ZVals的澄清

发布时间:2020-12-13 17:43:28 所属栏目:PHP教程 来源:网络整理
导读:我正在读这个: http://www.dereleased.com/2011/04/27/the-importance-of-zvals-and-circular-references/ 还有一个让我失望的例子. $foo = $bar;$bar = $foo;$baz = 'baz';$foo = $baz;var_dump($foo,$bar);/*string(3) "baz"NULL*/ If you’ve been follo
我正在读这个: http://www.dereleased.com/2011/04/27/the-importance-of-zvals-and-circular-references/

还有一个让我失望的例子.

$foo = &$bar;
$bar = &$foo;
$baz = 'baz';

$foo = &$baz;

var_dump($foo,$bar);
/*
string(3) "baz"
NULL
*/

If you’ve been following along,this should make perfect sense. $foo
is created,and pointed at a ZVal location identified by $bar; when
$bar is created,it points at the same place $foo was pointed. That
location,of course,is null. When $foo is reassigned,the only thing
that changes is to which ZVal $foo points; if we had assigned a
different value to $foo first,then $bar would still retain that
value.

我学会了用C编程.我知道PHP是不同的,它使用ZVals而不是内存位置作为参考.但是当你运行这段代码时:

$foo = &$bar;
$bar = &$foo;

在我看来,会有两个ZVals.在C中,将存在两个存储器位置(并且值将是相反的存储器位置).

谁能解释一下?

解决方法

它主要归结为符号表的工作原理.这是一张有两面的桌子:

symbol name  |  value
-------------+-------
             |

有趣的是,可以为一个值分配多个名称:

symbol name  |  value
-------------+-------
foo,bar     | 'baz'

使用=分配符号时,表的值侧会发生变化:

$baz = 42;

symbol name  |  value
-------------+-------
baz          | 42

使用=&分配时,符号名称侧移动到值为的位置:

$foo =& $baz;

symbol name  |  value
-------------+-------
baz,foo     | 42

所以在你的例子中,从头开始:

$foo =& $bar;
($bar does not exist,is null,which is implicitly created,$foo is pointed to where the implicitly created $bar points)

symbol name  |  value
-------------+-------
foo,bar     | null


$bar = &$foo;
(no real change,$bar is pointed to where $foo is pointing)

symbol name  |  value
-------------+-------
foo,bar     | null


$baz = 'baz';

symbol name  |  value
-------------+-------
foo,bar     | null
baz          | 'baz'


$foo = &$baz;
($foo is pointed to where $baz is pointing)

symbol name  |  value
-------------+-------
bar          | null
baz,foo     | 'baz'

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读