2013-03-16 3 views
2

Я использую активную запись в течение довольно длительного времени, и я хотел немного изменить декорации, некоторые друзья-разработчики предложили заглянуть в ORM, все проекты ORM, на которые я смотрел, требуют отдельного класса, расширяющего ORM класс.Динамически создаваемые классы

Мой вопрос: есть ли способ динамического создания класса с использованием PHP изнутри функции безeval?

Это то, что у меня есть:

<?php 
    class Constructor 
    { 
      function new_class($class) 
      { 
        $myself = get_called_class(); 
        eval("class {$class} extends {$myself} { }"); 
      } 
      function say_hi() 
      { 
        $class = get_called_class(); 
        echo "Hi, {$class}!"; 
      } 
    } 

    $constructor = new Constructor; 
    $constructor->new_class("Greeter"); 

    $greeter = new Greeter; 

    $greeter->say_hi(); // Hi, Greeter! 

Но, мой клиент сообщает мне, что eval блокируется на его среду из-за него быть на хостинг.

+0

но почему? создать класс, поместить параметры в массив, добавить методы '__set' и' __get' - установить параметры в массиве, вы можете добавить параметр '$ name', который установит' setName ($ name) 'и он будет имя класса, пытающегося получить, сделать 'getName(). Наследник класса. – mkjasinski

+0

В PHP нет «красивого» способа сделать это. Вы можете использовать eval() или создать файл с определением класса во время выполнения, а затем включить() это ... Но подумайте об изменении дизайна вашей программы. См. Http://stackoverflow.com/questions/3490474/how-to-create-or-define-class-in-php-at-runtime –

ответ

2

Возможно, вы не хотите этого делать. Но в качестве обходного пути вы можете использовать тот же подход, что и через eval(), но как только вы построите строку, которую вы будете кормить, чтобы ее использовать, просто напишите ее как файл и включите ее снова.

Что-то вроде этого:

function my_eval($str) 
{ 
    $filename = uniqid().'.tmp'; 
    file_put_contents ($filename, $str); 
    include $filename; 
    unlink ($filename); 
} 

Я написал это из памяти и не проверял, но я думаю, что это следует сделать трюк. Только оговорка, которую я сейчас вижу, заключается в том, что вы по существу делаете то же самое, что и eval(), и этот вариант не позволит создавать переменные в той же области, что и вызывающий контекст (хотя вы могли бы использовать $ GLOBALS [] чтобы обойти это для глобальных переменных сферы).

Смежные вопросы