當從ref函數返回的值被分配給多個變量時,第一個之後的賦值似乎複製了該值。PHP:ref函數返回的值看起來會被複制到多個賦值中
我用來測試它的代碼是:
[email protected]:/tmp# php -r 'function &bar() {static $x; if (NULL === $x) {$x=range(1,99999);}; return $x;}; var_dump(memory_get_usage()); bar(); var_dump(memory_get_usage()); $b1=bar(); var_dump(memory_get_usage()); $b2=bar(); var_dump(memory_get_usage()); $b3=bar(); var_dump(memory_get_usage());'
int(95872)
int(20345912)
int(20346040)
int(33395000)
int(46444184)
相同的代碼,格式化,並帶有註釋:
function &bar() {static $x; if (NULL === $x) {$x=range(1,99999);}; return $x;};
var_dump(memory_get_usage()); // starting out with 95872
bar();
var_dump(memory_get_usage()); // 20345912 - first call to bar() sets the static $x
$b1=bar();
var_dump(memory_get_usage()); // 20346040 - first assignment consumes almost no memory
$b2=bar();
var_dump(memory_get_usage()); // 33395000 - second assignment seems to copy it
$b3=bar();
var_dump(memory_get_usage()); // 46444184 - third assignment seems to copy it again
沒有任何理由只有第一項任務是裁判,而其他被返回複製?
爲了便於比較,這是當值不是一個函數的返回會發生什麼:
[email protected]:/tmp# php -r 'var_dump(memory_get_usage());; $a=range(1,99999); var_dump(memory_get_usage()); $b=&$a; var_dump(memory_get_usage()); $c=&$a; var_dump(memory_get_usage());'
int(92224)
int(20342024)
int(20342152)
int(20342280)
相同的代碼,格式:
var_dump(memory_get_usage()); // int(92224)
$a=range(1,99999);
var_dump(memory_get_usage()); // int(20342024)
$b=&$a;
var_dump(memory_get_usage()); // int(20342152)
$c=&$a;
var_dump(memory_get_usage()); // int(20342280)
正如你所看到的,幾乎沒有使用內存通過參考進行多個分配。
在發佈到bugs.php.net之前,我想知道它是否是我不知道的預期行爲。任何人都知道它爲何發生?
*(參考)* [寫入時複製在PHP語言(PDF)(http://www.trl.ibm.com /people/mich/pub/200901_popl2009phpsem.pdf) – Gordon 2010-07-01 20:46:16