动态创建类

时间:2013-03-16 13:10:37

标签: php class frameworks code-generation

我一直在使用活动记录,我希望稍微改变一下风景,一些开发人员朋友建议调查ORM,我看过的所有ORM项目都需要一个扩展ORM类的单独类。 / p>

我的问题是:有没有办法在函数中使用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由于他在共享托管上而被阻止了他的环境。

1 个答案:

答案 0 :(得分:2)

你可能不想这样做。但作为一种解决方法,您可以使用与通过eval()相同的方法,但是一旦构建了将要提供给eval的字符串,您只需将其作为文件写出并再次包含它。

这样的事情:

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

我是从内存中写的,没有测试过,但我认为它应该可以解决问题。我现在看到的唯一警告是你仍然基本上和eval()做同样的事情,这个变体不允许你在与调用上下文相同的范围内创建变量(虽然你可以使用$ GLOBALS []解决全局范围变量的问题。)