Начиная с PHP 7.0, с небольшим творческим потенциалом и знанием некоторых менее известных функций PHP, вы можете абсолютно сделать это, не прибегая к eval или созданию файлов сценариев динамически. Вам просто нужно использовать анонимные классы и class_alias (), например:
spl_autoload_register(function ($unfoundClassName) {
{
$newClass = new class{}; //create an anonymous class
$newClassName = get_class($newClass); //get the name PHP assigns the anonymous class
class_alias($newClassName, $unfoundClassName); //alias the anonymous class with your class name
}
Это работает, потому что анонимным классам по-прежнему присваивается имя за кулисами, и они помещаются в глобальную область видимости, поэтому вы можете свободно выбирать имя класса и псевдоним его. Посмотрите второй комментарий по ссылке анонимных классов выше для получения дополнительной информации.
Сказав это, я чувствую, что все люди в этом вопросе, которые говорят: «Эвал - всегда очень плохая идея. Просто не используйте ее никогда!» просто повторяют то, что слышали от улья, и не думают сами за себя. Eval есть в языке по определенной причине, и есть ситуации, когда он может быть эффективно использован. Если вы используете более старую версию PHP, eval может быть хорошим решением здесь.
Однако , они верны в том, что может открыть очень большие дыры в безопасности, и вы должны быть осторожны в том, как вы их используете, и понимать, как устранить риски. Важно то, что, как и SQL-инъекция, вы должны очистить любой ввод, введенный в оператор eval.
Например, если ваш автозагрузчик выглядел так:
spl_autoload_register(function ($unfoundClassName) {
{
eval("class $unfoundClassName {}");
}
Хакер может сделать что-то вроде этого:
$injectionCode = "bogusClass1{} /*insert malicious code to run on the server here */ bogusClass2";
new $injectionCode();
Видите, как это может стать дырой в безопасности? Все, что угодно , которое хакер поместит между двумя именами bogusClass, будет запущено на вашем сервере оператором eval.
Если вы настроите свой автозагрузчик для проверки переданного имени класса (т.е. выполните preg_match, чтобы убедиться, что нет пробелов или специальных символов, сверяете его со списком допустимых имен и т. Д.), Вы можете устранить эти риски и затем Eval может быть совершенно нормально использовать в этой ситуации. Если вы используете PHP 7 или выше, я рекомендую использовать анонимный метод псевдонима класса выше.