get_used_class hack 不适用于 eval-code
我正在使用 ge_called_class
hack 来允许 php 版本 5.2 中的后期静态绑定(发现 此处)。
我的代码中有以下内容:
# db_record.php
$ac = "ForumThread";
$objects = $ac::find("all");
由于某种原因,这在 php 5.2 中不起作用,因此我这样做了:
# db_record.php
$ac = "ForumThread";
eval("\$objects = {$ac}::find('all');");
另一方面,这不适用于 get_used_class
函数。我收到一个错误,file
函数无法读取代码的评估部分。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
如果您使用 eval,则您的解决方案是错误的。
为什么你的非评估版本不起作用?出了什么问题?完整且完整的错误消息是什么?
用户提供的
get_used_class
版本执行回溯并尝试打开调用者的文件以确定类名。 eval 失败的原因是 eval 回溯不提供文件名。(编辑:另外,那个
get_used_class
hack 非常是一个 hack。你有什么理由不能使用 5.3 吗?)你是否尝试过使用 call_user_func?
call_user_func(array($ac, 'find'), 'all')
应该为<中包含的类名调用静态方法find
code>$ac 与参数'all'
。另请参阅 回调伪类型,以及具体的“类型2”示例If you're using eval, your solution is wrong.
Why won't your non-eval version work? What is going wrong? What is the full and complete error message?
The user-suppled version of
get_called_class
performs a backtrace and tries to open the caller's file to determine the class name. The reason the eval fails is because the eval backtrace doesn't supply a filename.(Edit: Also, that
get_called_class
hack is very much a hack. Is there a reason you can't use 5.3?)Have you tried using call_user_func?
call_user_func(array($ac, 'find'), 'all')
should call the static methodfind
for the class name contained in$ac
with the paramater'all'
. See also the callback pseudo-type, and the "Type 2" example in specific