关于 PHP 的变量按值传递和按引用传递

4
我是一位有用的助手,可以为您翻译文本。

我对PHP处理变量值分配的方式有一个问题。

我们有以下语句:

$myVariable = "value";

上述语句为变量$myVariable分配了一个值,并在内存中分配了一个位置。
但如果我们将以下语句添加到上述脚本中:
$secondVariable = $myVariable;

那么:

关于性能问题,建议避免重复值,如果值不打算更改,则继续使用引用(C ++,Dietel&Dietel的著名书籍如何在C ++中编程)

但是PHP呢?我听说过,只是听说过,PHP通过按引用调用而不是按值执行一些技巧并管理这些重复项($secondVariable = $myVarible),直到对$secondVariable进行一些更改之后才复制变量。

结论:

$myVariable = "value";

$secondVariable = $myVariable;

这在C++中是这样的:

string myVariable = "value";

string secondVariable = &myVariable;

虽然我知道PHP是用C语言编写的,但C++是C的近亲。

请问上述结论是否正确,如果PHP像C和C++一样,在变量赋值时会创建一个新的内存位置,还是它不关心这个问题?


你是在试图微调某个具体的东西,有实际的理由吗?在PHP中的引用并不类似于C语言中的指针。 - mario
1
简短回答 - PHP不会为您发布的示例分配两倍的内存。 - N.B.
1个回答

3
这有点不同。在PHP中,您还可以使用指向引用的指针:
$a = &$b ;

如果您修改 $a,就会同时修改 $b(反之亦然),因为它们引用的是同一块内存地址。当您执行以下操作时:
$a = 'something' ;
$b = $a ;
$b被作为$a的副本进行管理。这两个变量是独立的。但是,在您修改$b(或$a)之前,PHP只会存储对$a的引用。这就是为什么在您修改$a$b之前,只有一个内存数量被使用的原因。

要确认这一点,您可以使用"memory_get_usage"函数并进行测试:
[dcordel:~] master+ ± php /tmp/test-1.php 

$aVar = str_repeat('a', 268435456);
$another = &$aVar ;
Mem : 256 Mo

[dcordel:~] master+ ± php /tmp/test-2.php 
$aVar = str_repeat('a', 268435456);
$another = str_repeat('a', 268435456);
Mem : 512 Mo

[dcordel:~] master+ ± php /tmp/test-3.php     
$aVar = str_repeat('a', 268435456);
$another = $aVar ;
//before
$another.= 'a' ;
//after

before update : Mem : 256 Mo
after update :  Mem : 512 Mo

这是一个很棒的答案。 - Pogrindis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接