gpt4 book ai didi

php - 关于PHP的变量call-by-value和call-value-reference

转载 作者:可可西里 更新时间:2023-10-31 23:20:13 25 4
gpt4 key购买 nike

我对 PHP 处理变量赋值的方式有疑问。

我们有以下声明:

$myVariable = "value";

上述语句为变量$myVariable赋值,然后为其分配内存位置。

但是如果我们在上面的脚本中加入如下语句:

$secondVariable = $myVariable;

然后:

关于性能问题,建议避免重复值,如果值不会改变,则继续使用引用(C++,Dietel & Dietel 的名著 How to Program in 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 中使用指向引用的指针:

$a = &$b ;

如果您修改 $a,您也会修改 $b(反之亦然),因为它与引用的内存地址相同。

当你这样做时:

$a = 'something' ;
$b = $a ;

$b 作为$a 的副本进行管理。两个变量都是独立的。但是,在您修改 $b(或 $a)之前,PHP 只存储对 $a 的引用。这就是为什么在您修改 $a 或 $b 之前,您只有一个数量的 RAM 被使用。

为了确定这一点,您可以使用函数“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

关于php - 关于PHP的变量call-by-value和call-value-reference,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24576816/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com