Задать вопрос
Slavenin999
@Slavenin999
программист php/erlang/elixir/js

Выгрузить класс из памяти

Привет Хабр!
Возник вот такой вот вопрос. Возможно ли выгрузить ранее загруженный класс? Т.е. раньше его подключают в каком-то из файлов, а мне нужно его как-то выгрузить. Полазил по ману по гуглу, не нашёл ничего похожего. Обращаю внимание, не объект класса, а именно сам класс, если быть точным, то он там не один, мне кажется их несколько десятков, но сути это не меняет.
  • Вопрос задан
  • 4566 просмотров
Подписаться 4 Оценить 2 комментария
Пригласить эксперта
Ответы на вопрос 6
@mayorovp
Лучше поправьте архитектуру, введя новый базовый класс без инициализации Smarty, или используя ленивое создание объекта. Создавать сложный объект для того, чтобы удалить его как неиспользуемый — очень дурной стиль.
Ответ написан
youROCK
@youROCK
Может быть, с помощью runkit это и можно сделать… Стандартными средствами, вроде как, нельзя.
Ответ написан
@egorinsk
Бросайте страдать фигней.

Если вам не нужен смарти, не загружайте его в память в первую очередь.
Ответ написан
@Vampiro
Есть система, в ней используется шаблонизатор (Smarty), который инициализируется как поле родительского класса всех модулей. Есть модуль которому шаблонизатор не нужен.

Найдите модуль родителя. скопируйте его, назовите как-то а-ля BaseModuleNoSmarty. Выкиньте оттуда все, что связано со смарти и отнаследуйтесь от него. То есть у вас два варианта, быстрый и хороший:
хороший:
было
class MyModule extends BasicModule
стало
class MyModule extends BasicModuleNoSmarty

и второй, с большим объемом рефакторинга:
было
class MyModule extends BasicModule
class BasicModule extends AbstractModule ( а может это и базовый класс, тогда чуть проще)
стало
class MyModule extends BasicModuleNoSmarty
class BasicModule extends BasicModuleNoSmarty{
тут добавление Smarty куда надо
}
class BasicModuleNoSmarty extends AbstractModule {
тут все, что было в обычном модуле но без шаблонизатора.
}

Это если вы не хотите переделывать реализацию базового класса всех модулей.
Ответ написан
Комментировать
kyberorg
@kyberorg
Насколько я понимаю процесс, аналог «предпроцессора» в PHP проходит и грузит все include/require в память. Это если для загрузки классов используют эти простые директивы. В данном случае выгрузить что-то из памяти не получится (либо получится, но явно не средствами самого PHP). Так как в PHP нет classpath'a, который можно было бы изменять в момент выполнения (runtime).

Однако в PHP есть такая вещь как spl_autoload. И если класс загружается с помощью такого загрузчика, то есть возможность его выгрузить: php.net/manual/en/function.spl-autoload-unregister.php

>он там не один, мне кажется их несколько десятков
Это можно узнать через механизмы рефлексии.
Ответ написан
7workers
@7workers
Интересная задача. А попробуйте вытянуть имена классов помощи get_declared_classes() и переопределить их пустыми: class Foo {}, используя eval() например. Расскажите, какой эффект был.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы