【问题标题】:php __autoload() and dynamic / runtime class definition - is there a way without eval?php __autoload() 和动态/运行时类定义 - 有没有没有 eval 的方法?
【发布时间】:2010-09-26 22:18:24
【问题描述】:

我在搜索相关帖子后阅读了this post

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

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

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

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

本意是用这种方法定义一个类,如果不存在,然后将类定义写入文件。

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

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

【问题讨论】:

    标签: php class runtime autoload


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      你不能使用变量作为类名(除非你说,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);
      

      如果您的日志显示您有任何这些用户警告,您应该使用它来提醒您为新表创建一个适当的类。


      你的评论:

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

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

      【讨论】:

      • 这是最好的答案,因为尝试使用动态类构造方法来解决问题忽略了我们的目标是为表实例化一个有效的 DAO 类。但是,如果尚未创建任何类,我们仍然会遇到如何在运行时处理此问题的问题。我认为可以使用回退到文件写入和工厂类的组合。例如,创建一个工厂类以返回可能在具有新表结构的新插件中引用/创建的对象。在那些中,尝试包含,回退到一个新文件。这应该有效。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-08-02
      • 1970-01-01
      • 1970-01-01
      • 2020-11-18
      • 2016-04-02
      • 2012-10-23
      • 1970-01-01
      相关资源
      最近更新 更多