0

我在搜索相关帖子后阅读了这篇文章。

我有一个略有不同但相关的问题。

有没有没有 EVAL() 的方法(因为这是一个坏主意 - 如果有人允许用户提供在 eval 中使用的值等),这样您就可以定义类的结构,例如:

if(!class_exists($className) && dao::tableExists($className)) {
   class $className extends daoObject {
     public function __construct($uid) {
      parent::__construct($uid);
     }
   }
   dao::generateClass($className);
}

这样做的原因是,当新的核心表被添加到框架时,它们可以与通用数据访问对象一起用于访问相应的字段(通过父级中的 __call、添加/插入和更新/删除的 getter/setter)为每个类编写一个类,而不需要编码人员编写一个类,然后必须检查它或为各种类型的表编写自定义代码生成器。daoObject 为我完成了这一切。

目的是使用这种方法来定义一个类,如果它不存在,然后将类定义写入文件。

如果对应的表名不存在,则会失败。如果该类存在(例如,下次运行时),则不会定义它。如果它不存在但是是一个表名,您可以在第一次调用它时创建、使用并保存它,这将在插入新表并运行脚本以插入数据时发生。作者将仅通过 csv 定义表字段和示例数据。该脚本将生成类并一键导入数据。我可以将定义写入文件,然后包含它,这似乎可以工作,但我想在修改对象的属性之后这样做,这样我就不必两次写入文件来完成它工作。

这是简化的,但有可能吗?

4

2 回答 2

0

我认为这是不可能的;正如您所说,最好的选择可能是将类写入文件,然后自动加载该/那些类。

于 2010-09-26T22:26:56.320 回答
0

您不能将变量用作类名(除非您说,使用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 类,同时在数据库中创建新表。为什么这不是你的解决方案?

于 2010-09-26T22:33:59.487 回答