PHP: значения, возвращаемые ref из функций, похоже, копируются при нескольких назначениях - PullRequest
2 голосов
/ 02 июля 2010

Когда значение, возвращаемое функцией с помощью ref, присваивается нескольким переменным, присваивания после первой, кажется, копируют значение.

Код, который я использовал для проверки:

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)

Тот же код, отформатированный и с комментариями:

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

Есть ли какая-либо причина, по которой ref возвращает только первое назначение, а другие копируются?

Для сравнения это то, чтопроисходит, когда значение не возвращается из функции:

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)  

Тот же код, отформатированный:

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, мне было интересно, ожидаемое ли это поведение, о котором я не знаю.Кто-нибудь знает, почему это происходит?

1 Ответ

3 голосов
/ 02 июля 2010

& требуется как для функции, так и для вызова. Итак, следующее

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(54296)
int(7843472)
int(7843520)
int(7843520)
int(7843544) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...