Задача
Необходимо создать класс, о котором не все известно до момента выполнения программы.
Решение
Это делается при помощи функции eval() со встроенными переменными:
eval("class van extends $parent_class {
function van() {
\$this->$parent_class();
}
};");
$mystery_machine = new van;
Обсуждение
В то время как использование в PHP имен переменных для вызова функций или создания объектов вполне допустимо, определять таким же образом функции и классы нельзя:
$van(); // правильно
$van = new $parent_class // правильно
function $van() {}; // не правильно
class $parent_class {}; // не правильно
Попытка выполнения любого из последних двух примеров приведет к синтаксической ошибке, поскольку PHP ожидает строку, а ему предлагают переменную.
Поэтому если необходимо создать класс с именем $van, но заранее неизвестно, что будет храниться в $van, следует применить функцию eval(), которая проделает всю «грязную» работу:
eval("class $van {};");
Каждый вызов функции eval() сильно снижает производительность, поэтому для сайтов с большим трафиком надо постараться так реструктурировать код, чтобы по возможности избежать таких приемов.
Кроме того, если определение класса основано на вводе пользователей, следует предотвратить употребление любых потенциально опасных символов.