我一直在使用活动记录,我希望稍微改变一下风景,一些开发人员朋友建议调查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
由于他在共享托管上而被阻止了他的环境。
答案 0 :(得分:2)
你可能不想这样做。但作为一种解决方法,您可以使用与通过eval()
相同的方法,但是一旦构建了将要提供给eval的字符串,您只需将其作为文件写出并再次包含它。
这样的事情:
function my_eval($str)
{
$filename = uniqid().'.tmp';
file_put_contents ($filename, $str);
include $filename;
unlink ($filename);
}
我是从内存中写的,没有测试过,但我认为它应该可以解决问题。我现在看到的唯一警告是你仍然基本上和eval()
做同样的事情,这个变体不允许你在与调用上下文相同的范围内创建变量(虽然你可以使用$ GLOBALS []解决全局范围变量的问题。)