Разработчику. Сборник рецептов PHP
Задавайте вопросы

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

Вернуться назад

Задача

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

Решение

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

См. также

Документацию по функции val() на http://www.php.net/eval.

Вернуться назад

Рейтинг@Mail.ru

Яндекс.Метрика

Индекс цитирования

Рейтинг Сайтов ДОСКИ.РУ