有没有办法在PHP中动态地和有条件地创建类定义,即
if (condition matches)
include file containing class definition
else
class myclass extends ancestor_class { .................... }
没有eval()
?
我的背景是this question的接受答案。我正在寻找构建不可触及的核心库的最佳方法,如有必要,用户定义的空类扩展核心库。
如果某个祖先类没有用户定义的空类,我想“动态”创建最终的类定义。
包含另一个包含文件(包含空类定义)是不可能的,因为会有很多类。
更新:这似乎可以在正常情况下阻止 - 没想到这一点。然而,根据this article,它似乎也被认为是不好的做法,将来可能会被删除。嗯。欢迎创意。
答案 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
:
eval
uate it 但我真的不会这样做,至少有两个原因:
看到你的更新,我尝试了条件声明:
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中的表现如何 - 我喜欢每个文件有一个类...
(是的,个人意见)