我最近遇到了一个问题(PHP: variable value mysteriously set to 0),其中一个变量被值传递给PHP函数,并且不知何故该变量的值发生了变化,如下所示:
$var = 'hello';
some_function($var);
echo $var; // outputs 0
有人假设它是一个用C编写的旧函数,并且它的内部正在做一些破坏变量的东西,因为在C中显然你可以做那种事情。无论如何,我试图先复制该值,然后将其传入,如下所示:
$var = 'hello';
$var2 = $var;
some_function($var2);
echo $var; // Still outputs 0
当然这没有帮助,因为,当我阅读here时,PHP只是将符号表中的$var2
指向与$var
相同的zval容器并增加该zval容器的引用计数。当然,如果{by}值重新分配$var2
,那么应该为它创建一个新的zval容器,但这显然不是一个常规的value-value(在上一个问题中有一点关于这一点) __set()
魔法方法)。我假设存储了值的物理内存地址发生了某些事情,而不是通过正常的PHP机制发生的赋值,因此指向该zval的所有内容都会受到影响。很好。
我的解决方法是找到克隆原语$var
的方法。很抱歉,如果这是重复,但我在克隆类上发现了很多东西,但没有克隆原语,我认为因为PHP应该自动正确地执行此操作。我最终使用了这个:
$var = 'hello';
$serialized_var = serialize($var);
$var2 = unserialize($serialized_var);
some_function($var2);
echo $var; // Outputs 'hello', yay!
我只是想知道,有更好的方法吗?让我们假设没有其他的解决方法,比如使用不同的函数或其他东西,我们必须得到一个由变量组成的真正副本。怎么可以去做呢?