文档中有一些片段说明了这是如何工作的,但有一点不清楚,我在下面说明:
/// Example 1
$a = 10;
xdebug_debug_zval('a');
/// Output:
/// a:(refcount=1, is_ref=0),int 10
/// Example 2
$a = 10;
$b = 10;
xdebug_debug_zval('a','b');
/// Output:
/// a:(refcount=1, is_ref=0),int 10
/// b:(refcount=1, is_ref=0),int 10
/// Example 3
$a = 10;
$b = $a;
xdebug_debug_zval('a','b');
/// Output:
/// a:(refcount=2, is_ref=0),int 10
/// b:(refcount=2, is_ref=0),int 10
/// Example 4
$a = 10;
$b = &$a;
xdebug_debug_zval('a','b');
/// Output:
/// a:(refcount=2, is_ref=1),int 10
/// b:(refcount=2, is_ref=1),int 10
/// Example 5
$a = 10;
$b = $a;
$c = $a;
xdebug_debug_zval('a','b','c');
/// Output:
/// a:(refcount=3, is_ref=0),int 10
/// b:(refcount=3, is_ref=0),int 10
/// c:(refcount=3, is_ref=0),int 10
/// Example 6
$a = 10;
$b = &$a;
$c = $a;
xdebug_debug_zval('a','b','c');
/// Output:
/// a:(refcount=2, is_ref=1),int 10
/// b:(refcount=2, is_ref=1),int 10
/// c:(refcount=1, is_ref=0),int 10
/// Example 7
$a = 10;
$b = &$a;
$c = &$a;
xdebug_debug_zval('a','b','c');
/// Output:
/// a:(refcount=3, is_ref=1),int 10
/// b:(refcount=3, is_ref=1),int 10
/// c:(refcount=3, is_ref=1),int 10
对于我来说最不合逻辑的所有例子都是Example 6
,我真的不明白为什么在没有得到以下条目的所有行时我们必须调试
/// Output:
/// a:(refcount=3, is_ref=1),int 10
/// b:(refcount=3, is_ref=1),int 10
/// c:(refcount=3, is_ref=0),int 10
解释是什么事?
答案 0 :(得分:0)
如果你熟悉它,你必须从C语言的指针来考虑。 PHP中的变量是ZVAL的指针,所以当你" copy" PHP中的变量,PHP 不实际上复制了它的值,但增加了引用计数并重复了指针。但是如果你改变原始值,其他值也不会改变,因为PHP会做一些叫做 copy-on-write 的东西(除非refcount = 1,
$a = 10;
$b = $a; // $b is a soft copy of $a, refcount++
$a = 11; // $a changes, a new zval is created
虽然:
$a = 10;
$b = &$a; // $b is still a copy of a, but this time a reference
$a = 11; // $a and $b change
那么你的"示例6"会发生什么?好吧,PHP知道refcount> 1,但你不能"软拷贝" $ a&#; s zval in $ c,因为否则当你改变$ a或$ b时它也会改变$ c的值,所以$ c变成一个新的zval,refcount = 1.
$a = 10; // new zval created (refcount=1)
$b = &$a; // $b is a copy of $a but is_ref=1 (and refcount=2)
$c = $a; // $c is a NEW zval, refcount=1
我害怕我没有好好解释自己:(如果你还有疑问,我可以再试一次。