首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >php __autoload()和动态/运行时类定义--是否有一种不带eval的方法?

php __autoload()和动态/运行时类定义--是否有一种不带eval的方法?
EN

Stack Overflow用户
提问于 2010-09-26 22:18:24
回答 2查看 779关注 0票数 0

在搜索相关帖子之后,我阅读了这个职位

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

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

代码语言:javascript
运行
复制
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定义表字段和样本数据。此脚本将生成类并在一次命中导入数据。我可以将定义写到一个文件中,然后包含它,这似乎是可以工作的,但是我想在修改了对象的属性之后这样做,这样我就不必写两次文件才能使它工作。

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

EN

回答 2

Stack Overflow用户

发布于 2010-09-26 22:26:56

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

票数 0
EN

Stack Overflow用户

发布于 2010-09-26 22:33:59

不能为类名使用变量(除非使用eval())。

因此,如果您真的需要在运行时为没有为其定义类的表创建DAO对象,那么也许您应该为“其他表”创建一个DAO类,并在构造函数中传递表的名称。

代码语言:javascript
运行
复制
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类,在数据库中创建新的表。为什么这不是你的解决方案?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3800061

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档