动态定义一个类?

时间:2010-03-16 20:10:13

标签: php oop

有没有办法在PHP中动态地和有条件地创建类定义,即

if (condition matches)
  include file containing class definition
else
  class myclass extends ancestor_class { .................... }

没有eval()

我的背景是this question的接受答案。我正在寻找构建不可触及的核心库的最佳方法,如有必要,用户定义的空类扩展核心库。

如果某个祖先类没有用户定义的空类,我想“动态”创建最终的类定义。

包含另一个包含文件(包含空类定义)是不可能的,因为会有很多类。

  

更新:这似乎可以在正常情况下阻止 - 没想到这一点。然而,根据this article,它似乎也被认为是不好的做法,将来可能会被删除。嗯。欢迎创意。

1 个答案:

答案 0 :(得分:2)

请参阅问题下的评论以获取更多信息 - 我将尝试总结,因为它可能对其他人有用: - )


首先,我认为目标不是让用户自己创建几乎空的文件 - 我记得另一个问题,我认为这是来自你,弹出的地方。

如果是这样,为什么不动态创建那些几乎空的文件? 我的意思是,有些想法是这样的:

if (condition matches) {
    include file containing class definition
} else {
    create another file containg the alternate class definition
    include that other file
}

正如@Gordon在评论中所说,为了使事情变得更容易,可能会使用Zend_CodeGenerator来帮助完成代码生成任务。


正如所指出的那样:用户不太可能在library目录上具有写访问权限,但没有什么可以阻止您将这些文件创建到另一个“缓存”目录中 - 毕竟,它很可能是您的应用程序对至少一个目录具有写访问权限:

  • 缓存^^
  • 或者,至少,对于日志


解决方案是使用eval

  • 构建一个包含类'definition
  • 的字符串
  • eval uate it

但我真的不会这样做,至少有两个原因:

  • 调试可能会更难 - 即使是几乎空的文件/字符串
  • 使用文件意味着操作码缓存(APC或类似工具)
  • 并且,作为第三个,思考它:拥有一个文件意味着你的IDE可以解析它 - 可能有助于代码完成,类型提示,......


看到你的更新,我尝试了条件声明:

if (false) {
    class A {
        public $a = 10;
    }
} else {
    class A {
        public $a = 20;
    }
}

$a = new A();
var_dump($a);

将条件从false更改为true,反之亦然,我得到两个备用输出:

object(A)[1]
  public 'a' => int 20

object(A)[1]
  public 'a' => int 10

所以......好吧,似乎工作了!
(我很惊讶,我认为它只能用于功能!)

但是,我仍然不喜欢这个想法...不确定它在IDE中的表现如何 - 我喜欢每个文件有一个类...
(是的,个人意见)