Динамическое создание класса

Задача
Необходимо создать класс, о котором не все известно до момента выполнения программы.

Решение
Это делается при помощи функции 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() сильно снижает производительность, поэтому для сайтов с большим трафиком надо постараться так реструктурировать код, чтобы по возможности избежать таких приемов.

Кроме того, если определение класса основано на вводе пользователей, следует предотвратить употребление любых потенциально опасных символов.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела PHP на эту тему:
Динамическая реализация объекта
Добавление свойств в базовый объект
Доступ к переопределенным методам
Клонирование объектов
Обнаружение методов и свойств объекта

Вернуться в раздел: PHP / 7. Классы и объекты