PHP: işlevlerden ref tarafından döndürülen değerler birden atamaları kopyalanan görünüyor

0 Cevap php

Ref ile bir işlevinden döndürülen bir değer birden çok değişken atandığında, ilkinden sonra atamaları değerini kopyalamak gibi görünüyor.

Bunu test etmek için kullanılan kod:

root@kelso:/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)

Aynı kod, biçimlendirilmiş ve yorumlarla:

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

Diğer kopyalanan ise sadece ilk atama ref tarafından döndürülen herhangi bir nedeni var mı?

Karşılaştırma için, bu değer bir işlevinden döndürülen değil ne olur:

root@kelso:/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)  

Aynı kod, biçimlendirilmiş:

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)  

Gördüğünüz gibi, hemen hemen hiç hafıza referans birden atamaları için kullanılır.

Ben bilmiyorum da beklenen bir davranış olmadığını bugs.php.net bu göndermeden önce, ben merak ediyordum. Olur neden kimse bilmiyor?

0 Cevap