1

我最近遇到了一个问题(PHP:变量值神秘地设置为 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

当然这并没有帮助,因为正如我在这里阅读的那样, PHP 只是$var2在符号表中指向与该 zval 容器相同的 zval 容器$var并增加该 zval 容器的引用计数。当然,如果$var2是“按值”重新分配,则应该为其创建一个新的 zval 容器,但这显然不是常规的按值分配(在上一个问题中与__set()魔术方法有关) . 我假设存储值的物理内存地址发生了一些事情,而不是通过正常的 PHP 机制发生了分配,因此指向该 zval 的所有内容都会受到影响。很好。

我的解决方法是找到一种克隆原语的方法$var。抱歉,如果这是重复的话,但是我在克隆类上发现了很多东西,但在克隆原语上却一无所获,我认为是因为 PHP 应该自动正确地执行此操作。我最终使用了这个:

$var = 'hello';

$serialized_var = serialize($var);
$var2 = unserialize($serialized_var);

some_function($var2);
echo $var; // Outputs 'hello', yay!

我只是想知道,有没有更好的方法?让我们假设没有其他解决方法,例如使用不同的函数或其他东西,并且我们必须获得该变量的真实副本。怎么可能呢?

4

0 回答 0