PHP:如何正确地将基元复制到新的内存地址

时间:2016-04-22 01:44:15

标签: php memory memory-management pass-by-reference language-concepts

我最近遇到了一个问题(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!

我只是想知道,有更好的方法吗?让我们假设没有其他的解决方法,比如使用不同的函数或其他东西,我们必须得到一个由变量组成的真正副本。怎么可以去做呢?

0 个答案:

没有答案