Я пытаюсь понять, как PHP обрабатывает потребление памяти в этих двух примерах.
// foo.php
class foo{
public function __construct()
{
$a = new PDO(...);
$b = new StdClass;
$c = new Reflection;
$d = new SessionHandler;
}
public function w(){}
public function x(){}
public function y(){}
public function z(){}
}
class bar{
public function __construct(){}
public function w(){
return new PDO(...);
}
public function x(){
return new StdClass;
}
public function y(){
return new Reflection;
}
public function z(){
return new SessionHandler;
}
}
Теперь, в зависимости от приведенных выше двух примеров, я хотел бы знать, занимают ли эти два вызова одинаковый объем памяти или, другими словами, какой из них будет выполнен быстро.
$foo = new foo();
### VS
$bar = new bar();
$bar->w();
Я понимаю этот класс foo
создает экземпляры 4 объектов в течение одного экземпляра, в то время как класс bar
имеет один экземпляр, когда он вызывает метод w()
, Это похоже на foo
потребовалось бы больше памяти, но я также считаю, что php анализирует все, когда читает класс, даже методы, которые не вызываются, кажется, что нет никакой разницы.
Я также считаю, что php анализирует все, когда читает класс, даже методы, которые не вызываются
Ваша вера по крайней мере неосведомлена.
Разбор (Начальная ступень) это другой этап в выполнении скрипта, на самом деле это другой (второй) этап.
PHP не выполняет никакого кода перед выполнением (вторая стадия), он только компилируется (Начальная ступень) текстовая форма вашего кода в более компактное двоичное представление, называемое опкоды — похоже на коды операций, понятные электронике в любом процессоре.
Это причина, по которой модули PHP называются Коды операции существует — кешировать коды операций и пропустить разбор (Начальная ступень) текстового представления.
Самый эффективный способ сделать это с точки зрения памяти — создать экземпляр ваших ресурсов. лениво:
class Foo
{
private $x;
public function __construct()
{
//keep the constructor as lightweight as possible, ALWAYS
}
public function getX() {
if(!$this->x) {
$this->x = new X();
}
return $this->x;
}
}
Случай 1:
public function __construct()
{
$a = new PDO(...);
$b = new StdClass;
$c = new Reflection;
$d = new SessionHandler;
}
Для этого примера PHP собирается выделить память для переменных $ a, $ b, $ c и $ d. Когда метод конструктора заканчивает выполнение, ref-count для этих объектов немедленно достигнет 0, означая, что в следующем цикле сбора они будут удалены из памяти.
Случай 2:
public function w(){
return new PDO(...);
}
public function x(){
return new StdClass;
}
public function y(){
return new Reflection;
}
public function z(){
return new SessionHandler;
}
Методы w, x, y и z возвращают экземпляры различных объектов. Эти объекты будут храниться в памяти, пока ref-count> 0.
Пример:
$bar = new bar();
$bar->w(); //Returned object is not assigned to any variable, so it will be destroyed -> ref-count = 0
$x = $bar->x(); //ref-count = 1
$x2 = $x; //ref-count = 2
unset($x); //ref-count = 1
unset($x2); //ref-count = 0, bye-bye object
Чтобы понять что происходит за кулисами PHP управления памятью может заинтересовать чтение следующих справочных страниц:
Ответить на вопрос
"I would like to know if these two calls, occupy the same amount of memory, or in other terms which one would be executed fast"
Ну, в какой-то момент вы собираетесь использовать все 4 из этих объектов в вашем скрипте (я так понимаю?), Так что просто выберите шаблон и придерживайтесь его.
Скорость и потребление памяти будут зависеть от того, как вы будете использовать эти объекты.