oop — Как (если возможно) оптимизировать память в этом примере PHP

Я пытаюсь понять, как PHP обрабатывает потребление памяти в этих двух примерах.

Пример: 1

   // 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(){}
}

Пример: 2

 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 анализирует все, когда читает класс, даже методы, которые не вызываются, кажется, что нет никакой разницы.

-1

Решение

Я также считаю, что 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

Другие решения

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

1

По вопросам рекламы [email protected]