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