Динамическое создание классов (PHP)?

Требуется объявлять классы с именем, переданным в качестве параметра. Не создавать объект уже объявленного класса, а именно объявлять классы.
Я реализовал это с использованием eval():
$class = preg_replace('/([^_a-z0-9]+)/i', '_', $class);
$class = is_numeric(substr(trim($class), 0, 1)) ? ('_' . $class) : $class;
eval('class ' . $class . ' extends Page { /* ... */ }');

Собственно просьба проверить защиту eval() от внедрения левого кода (я вроде бы ошибок не нашёл, но мало ли), а лучше - подсказать реализацию без eval().
  • Вопрос задан
  • 7807 просмотров
Решения вопроса 2
GeneMoss
@GeneMoss
void
Как минимум, нужно делать проверку class_exists().

P.S.: Но затея весьма спорная.
Ответ написан
Комментировать
aktuba
@aktuba
Судя по тому, что новый класс = алиас предыдущего (без изменений), не проще использовать class_alias?
Ответ написан
Пригласить эксперта
Ответы на вопрос 5
AMar4enko
@AMar4enko
Вы меня простите, но вряд ли вам дадут совет, как наиболее оптимизированно сломать себе руку - в большинстве своем люди либо не ломали себе рук, либо это было очень неприятно.
Надеюсь, метафора вам понятна.
Ответ написан
Комментировать
konst20
@konst20
Программист, преподаватель, немного электронщик
Присоединяюсь к мнениям о том, что:
- обязательно проверку class_exists()
- затея спорная и из контекста/кода никак не следует ее оправданность.

Приведу пару примеров оправданности динамического создания классов и eval()
1) есть пачка клиентов (в смысле заказчиков). Для каждого в коде - свой класс, причем унификация невозможна: методы этих классов называются одинаково, смысл, входные и выходные параметры одинаковые, но реализованы для всех весьма по-разному в силу индивидуальных особенностей.
есть обработчики на сервере очередей, они универсальные. Обработчику передается имя класса, он создает объект и работает так, как нужно для данного заказчика.

2) есть псевдокод с однозначной логикой, заведомо безопасный. Для выполнения его в PHP заменяем просто через str_replace все согласно синтаксису PHP, и выполняем через eval()

Для того, чтобы указанное выше веселье можно было спокойно дорабатывать, сделаны доп. методы тестирования и обработки ошибок.
Ответ написан
Roosso
@Roosso
Нетипичный программист
Я бы везде префикс использовал.

Вместо этого:
$class = is_numeric(substr(trim($class), 0, 1)) ? ('_' . $class) : $class;

Это:
$class = "My_".$class;

При трассировке кода или другой отладки, сразу все будет хорошо выделяться.
Ответ написан
65536
@65536
Рекомендую пересмотреть архитектуру того, что вы делаете. Она должна базироваться на штатных возможностях языка, а не на мутных костылях
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы