php как посчитать количество созданных объектов на странице, как зарегистрировать общий деструктор для всех классов\объектов

Хочу посчитать количество создаваемых\созданных объектов на странице. Думаю если возможно то в общем деструкторе для всех объектов (если такой можно сделать) делать

$_SESSION['cou_obj']=$_SESSION['cou_obj']+1;

Но как общий деструктор зарегистрировать? Или как-то по другому можно посчитать кол-во объектов?

Объект - это то что получается после (или в результате использования) new

upd1 Я заканчиваю допереписывание сайта вна ООП. Стало интересно сколько объектов на каждой конкретной странице создается.

Объекты создаются только ... (абсолютно весь сайт!) на php, при помощи new.

Дело в том что не в каждом классе есть конструктор.

Мне уже понаподсказывали что можно попробовать каким-то профайлером, отладчиком...

Какие такие объекты?: ну вот например такие

    $vld = new Validator();
    $ust = new UserStatus();
    $rd = new Redirect();
    $e = new Err();
    $tr = new TrimTxt();
    $all_user_tags = new AllUserTags($uid);
    $user_logins = new UserLogins();
    $global_posts_search = new GlobalPostsSearch();

Самих классов примерно до 200 штук. И желательно посчитать без тяжких изменений кода - вот потому я и подумал что вдруг можно сделать деструктор общий для всех классов\объектов.

upd2 Зачем я занимаюсь такой "ерундой": Как-то где-то читал что в древних версиях можно было создавать (например!) 1 000 объектов, в свежих версиях можно создавать 10 000 объектов, а версии phpp 8 можно создавать 100 000 объектов...

Разве никто никогда не интересовался количеством создаваемых объектов на странице???

Вот потому и интересно мне сколько у меня. Может у меня десятки или сотни тысяч объектов создается? Тогда такой код назвать хорошим нельзя. Хотя код, во-первых, предназначен только для чтения и понимания человеком-программистом.

Есть вариант после каждого new делать

  $_SESSION['cou_obj']++; 

Наверное так и сделаю, хотя и будет небольшая заморочка с этим, но думаю что sed поможет мне в этом.

Как еще можно посчитать объекты?


И может в php9 появится возможность задавать один деструктор для всех объектов?


Ответы (2 шт):

Автор решения: WinterSilence
  1. Новые объекты создаются не только c помощью new, но и при клонировании (clone $obj), десериализации(unserialize(),json_decode() и т.д) и приведении ((object) [...]) и не всегда конструктор/деструктор вызывается при этом.
  2. Предопределённые классы php и расширений также могут не вызывать конструктор/деструктор при создании объектов.
  3. Статический анализ кода слишком сложен ввиду многообразия вариантов.
  4. Наследование/примеси проблематично реализовать по тем же причинам.

В теории можно отслеживать создание классов с помощью xdebug:

xdebug_start_function_monitor(['DateTime->__construct', 'Exception->__construct', 'MyClass->__construct']);
$date = new DateTime();
$obj = new MyClass();
$_SESSION['objects'] = xdebug_get_function_count();
// var_dump(xdebug_get_monitored_functions());
xdebug_stop_function_monitor();

или uopz:

uopz_set_hook('Exception', '__construct', function () {$_SESSION['objects']++;});

но эти варианты не срабатывают для некоторых предопределённых классов ( например, stdClass). Как вариант можно попробовать профилирование с помощью расширений xdebug или xhprof.

→ Ссылка
Автор решения: Maximmka

Ещё один вариант, если объекты создаются только по new (способ не учтет то что указано в ответе WinterSilence в п.1):

через IDE или текстовый редактор (например phpStorm, notepad++) сделать массовую замену по регулярному выражению:

Ищем (new .*\(.*\);)

Заменяем на $1\$_SESSION['cnt']++;

И в конце выводим $_SESSION['cnt']. Либо можно в файле который подключается при любом запросе объявить register_shutdown_function с выводом количества.

→ Ссылка