get_called_class hack不使用eval-code

时间:2010-06-13 23:05:21

标签: php eval static-classes late-static-binding

我正在使用ge_called_class hack来允许在PHP 5.2版中找到后期静态绑定(找到here)。

我的代码中有以下内容:

# db_record.php
$ac = "ForumThread";
$objects = $ac::find("all");

由于某种原因,这在php 5.2中不起作用,所以我这样做了:

# db_record.php
$ac = "ForumThread";
eval("\$objects = {$ac}::find('all');");

另一方面,这不适用于get_called_class功能。我收到一个错误,file函数无法读取代码的扩展部分。

1 个答案:

答案 0 :(得分:0)

如果您使用的是eval,那么您的解决方案是错误的。

为什么你的非评估版本不起作用?出了什么问题?什么是完整和完整的错误消息?

用户提供的get_called_class版本执行回溯并尝试打开调用者的文件以确定类名。 eval失败的原因是因为eval回溯不提供文件名。

(编辑:另外,get_called_class hack非常黑客。有没有理由你不能使用5.3?)

您是否尝试过使用call_user_funccall_user_func(array($ac, 'find'), 'all') 使用参数find$ac中包含的类名称调用静态方法'all'。另请参阅callback pseudo-type, and the "Type 2" example in specific