Для проверки использования памяти вы можете использовать следующий шаблон:
<?php
$mem = 0; // create variable before "memory_get_usage()";
$mem = memory_get_usage();
// Place your code here
$mem = memory_get_usage() - $mem;
print ("Memory used: $mem");
Например, я создал заглушку:
<?php
class foo {
function getuserName($a) {
return $a;
}
}
class bar {
function validateUserName($a) {
}
}
$mem = 0; // Allocate variable before "memory_get_usage()";
$mem = memory_get_usage();
$a = new foo();
$username = $a->getuserName('username');
$b = new bar();
$b->validateUserName($username);
$mem = memory_get_usage() - $mem;
print ("Memory used: $mem\r\n");
результат на php 5.6.40 win x64 равно 560 байт.
Если я изменю код на ваш второй вариант
...
$mem = 0; // Allocate variable before "memory_get_usage()";
$mem = memory_get_usage();
// Note I've changed $username to 'username'
(new bar())->validateUserName( (new foo())->getuserName('username') );
$mem = memory_get_usage() - $mem;
print ("Memory used: $mem\r\n");
Теперь результат равен 0 байт.
Давайте рассмотрим другой вариант:
...
function test() {
$a = new foo();
$username = $a->getuserName('username');
$b = new bar();
$b->validateUserName($username);
}
$mem = 0; // Allocate variable before "memory_get_usage()";
$mem = memory_get_usage();
test();
$mem = memory_get_usage() - $mem;
print ("Memory used: $mem\r\n");
Используемая память: 64
Давайте изменим функцию на второй вариант:
...
function test() {
(new bar())->validateUserName( (new foo())->getuserName('username') );
}
...
Теперь результат снова равен 64 байтов.
И еще один тест:
...
$mem = 0; // Allocate variable before "memory_get_usage()";
$mem = memory_get_usage();
$a = new foo();
$username = $a->getuserName('username');
$b = new bar();
$b->validateUserName($username);
unset($a);
unset($b);
unset($username);
$mem = memory_get_usage() - $mem;
print ("Memory used: $mem\r\n");
Здесь результат снова 0 .
Отсюда я могу предположить, что когда вы создаете глобальные переменные, они остаются все время, и объект, на который они ссылаются, не может быть собран сборщиком мусора, поэтому они остаются в памяти. Как только вы сбрасываете переменные, или объявляете их в определенной области (функции), или вообще не объявляете их - в результате нет никакой разницы. Чтобы увидеть, когда объект уничтожен, а память освобождена, вы можете добавить в классы дескрипторы:
...
function __destruct() {
print "foo/bar destroyed\r\n";
}
...
Тем не менее, запись вызовов в одну строку вообще не выделяет ненужные переменные, что увеличивает время выполнения.
Но моя рекомендация: не беспокойтесь о такой оптимизации на языке, таком как php. Сам язык не такой быстрый и не такой эффективный. Например, добавление каждого элемента в массив может стоить более 100 байт памяти. Не стоит тратить несколько байтов, делая код менее читаемым.