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 шт):
- Новые объекты создаются не только c помощью
new, но и при клонировании (clone $obj), десериализации(unserialize(),json_decode()и т.д) и приведении ((object) [...]) и не всегда конструктор/деструктор вызывается при этом. - Предопределённые классы php и расширений также могут не вызывать конструктор/деструктор при создании объектов.
- Статический анализ кода слишком сложен ввиду многообразия вариантов.
- Наследование/примеси проблематично реализовать по тем же причинам.
В теории можно отслеживать создание классов с помощью 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.
Ещё один вариант, если объекты создаются только по new (способ не учтет то что указано в ответе WinterSilence в п.1):
через IDE или текстовый редактор (например phpStorm, notepad++) сделать массовую замену по регулярному выражению:
Ищем (new .*\(.*\);)
Заменяем на $1\$_SESSION['cnt']++;
И в конце выводим $_SESSION['cnt']. Либо можно в файле который подключается при любом запросе объявить register_shutdown_function с выводом количества.