在搜索相关帖子之后,我阅读了这个职位。
我有一个稍微不同的,但相关的问题。
是否有一种不使用EVAL()的方法(因为这是一个不好的主意--如果有人允许用户提供eval中使用的值等,就会被滥用),例如,您可以定义类的结构:
if(!class_exists($className) && dao::tableExists($className)) {
class $className extends daoObject {
public function __construct($uid) {
parent::__construct($uid);
}
}
dao::generateClass($className);
}之所以这样做,是因为当新的核心表被添加到框架中时,它们可以与通用数据访问对象一起使用,用于访问相应的字段(父字段中的getters/setters、add/insert和update/delete),而无需为每个类编写类,而不必要求编码器编写类,或者为各种类型的表编写自定义代码生成器。daoObject为我做了这一切。
如果类不存在,则使用这种方法定义类,然后将类定义写入文件。
如果对应的表名不存在,它将失败。如果类存在(例如,下次运行它时),那么它就不会定义它。如果它不存在,但它是一个表名,您可以创建它,使用它,并在第一次调用它时保存它,这将在插入新表和运行脚本插入数据时发生。作者将通过csv定义表字段和样本数据。此脚本将生成类并在一次命中导入数据。我可以将定义写到一个文件中,然后包含它,这似乎是可以工作的,但是我想在修改了对象的属性之后这样做,这样我就不必写两次文件才能使它工作。
这是简化的,但有可能吗?
发布于 2010-09-26 22:33:59
不能为类名使用变量(除非使用eval())。
因此,如果您真的需要在运行时为没有为其定义类的表创建DAO对象,那么也许您应该为“其他表”创建一个DAO类,并在构造函数中传递表的名称。
class OtherTable extends daoObject {
public function __construct($uid, $tableName) {
$this->table = $tableName;
parent::__construct($uid);
}
}
$FootballTable = new OtherTable($uid, 'football');
trigger_error("You need a new table class!", E_USER_WARNING);如果您的日志显示您有任何这些用户警告,您应该使用它来提醒您为新表创建一个适当的类。
关于你的评论:
在运行时为一个新类生成代码,即使是作为一个后备条件,也不是一个好习惯。风险在于某些不受信任的内容潜入您的类定义(例如用户输入,但它可以是其他内容)。那么您就有了一个代码注入安全问题。
或者您需要一个泛型的任意表DAO类,就像我展示的那样,或者最好的解决方案是在开发过程中创建新的DAO类,在数据库中创建新的表。为什么这不是你的解决方案?
https://stackoverflow.com/questions/3800061
复制相似问题