php _uautoload()和动态/运行时类定义-有没有不使用eval的方法?

php _uautoload()和动态/运行时类定义-有没有不使用eval的方法?,php,class,runtime,autoload,Php,Class,Runtime,Autoload,我在搜索相关帖子后阅读 我有一个稍微不同但相关的问题 有没有办法不使用EVAL()(因为这是一个坏主意-如果有人允许用户提供EVAL中使用的值,则可能会被滥用,等等),这样您就可以定义类的结构,例如: if(!class_exists($className) && dao::tableExists($className)) { class $className extends daoObject { public function __construct($uid

我在搜索相关帖子后阅读

我有一个稍微不同但相关的问题

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

if(!class_exists($className) && dao::tableExists($className)) {
   class $className extends daoObject {
     public function __construct($uid) {
      parent::__construct($uid);
     }
   }
   dao::generateClass($className);
}
这是因为当新的核心表添加到框架中时,它们可以与通用数据访问对象一起使用,用于访问相应的字段(通过父级中的_调用,add/insert和update/delete获取/设置),而无需为每个字段编写类,不需要程序员编写一个类,然后检查它或为各种类型的表编写自定义代码生成器。daoObject为我做了这一切

其目的是使用这种方法定义一个不存在的类,然后将该类定义写入一个文件

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


这是简化的,但可能吗?

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

您不能使用变量作为类名(除非如您所说,使用
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);
如果您的日志显示您有这些用户警告中的任何一个,您应该使用这些警告作为提示,以便为新表创建适当的类


请回复您的评论:

在运行时为新类生成代码,即使是作为回退条件,也不是一个好习惯。风险在于某些不受信任的内容会潜入类定义(例如用户输入,但也可能是其他内容)。那你就有安全问题了


要么像我所展示的那样需要一个通用的any table DAO类,要么最好的解决方案是在开发过程中,在数据库中创建新表时创建新的DAO类。为什么这不是您的解决方案?

这是最好的答案,因为尝试用动态类构造方法解决问题忽略了我们的目标,即为表实例化有效的DAO类。但是,如果还没有创建任何类,我们仍然会遇到如何在运行时处理这个问题。我认为可以结合使用回退到文件编写和工厂类。例如,创建一个factory类以返回可能在具有新表结构的新插件中引用/创建的对象。在这些文件中,尝试包含、回退到新文件。这应该行得通。