【问题标题】:get_called_class hack not working with eval-codeget_call_class hack 不适用于 eval 代码
【发布时间】:2011-03-03 07:56:51
【问题描述】:

我正在使用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 函数无法读取代码的评估部分的错误。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    (编辑:另外,get_called_class hack 是一个 hack。你有什么不能使用 5.3 的原因吗?)

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

    【讨论】:

    • 我完全同意没有必要使用eval,但碰巧它可以在我自己的 php 5.3 机器上运行,但不能在 5.2 的服务器上运行。运行它会触发这个错误: Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM in /home/virtual/atanea.dk/vendor/framework/lib/db_record.php on line 89 Fatal error: Call to a member function assign() on a第 87 行 /home/virtual/atanea.dk/vendor/framework/lib/action_view.php 中的非对象`
    • 至于我为什么不使用 5.3 是因为我的托管公司还不支持它,理由是它仍然不稳定。所以我不得不做所有的黑客。
    • 仍然不稳定?这个月已经停播一年了。你的主人充满了它。至于错误,您是否尝试过使用call_user_func? call_user_func(array($ac, 'find'), 'all')应该$ac中包含的类名调用静态方法find,参数为'all'。 (这已集成到我的答案中。)
    • 不,我没试过。我会尝试看看是否解决了问题。我什至知道它存在,但没想到要使用它。有时它只是有助于将想法反弹给他人:) 谢谢!
    • 我假设它可以工作。很高兴知道! :)
    猜你喜欢
    • 2013-07-07
    • 2016-10-15
    • 1970-01-01
    • 1970-01-01
    • 2014-03-13
    • 2011-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多