【问题标题】:call_user_func() or $callback() not workingcall_user_func() 或 $callback() 不工作
【发布时间】:2014-01-27 18:29:14
【问题描述】:

在 PHP 路由文件中,我想回调一个名为 homepage_display() 的函数。

函数名在$callback变量中,当我调用时,它不起作用:

$callback = "homepage_display";

$callback(); // doesn't work
call_user_func($callback); // doesn't work either
homepage_display(); // works!!

虽然上面这段特定的代码在任何 sn-p 中都有效,但相同的机制在我的一个函数中不起作用。知道什么会导致这种行为吗?我尝试删除 _ 认为这可能是编码问题,但它没有解决任何问题。

编辑:

为了明确我的观点,我在将其作为回调函数调用之前添加了一个显式赋值 $callback="homepage_display";。您可以在这张图片上看到它只是不起作用。而直接调用homepage_display();,确实如此。如果有人理解某事,我很好奇:)

不工作:

工作:

【问题讨论】:

  • 对我来说很好:3v4l.org/GuNUN
  • 是的,对我来说也很好,但不适用于实际的 route() 函数。我检查了(尝试在将 $callback 用作回调函数之前打印它),一切似乎都很好。除非它不起作用

标签: php function callback


【解决方案1】:

答案一言以蔽之:namespace foo\bar;

在非全局命名空间范围内不能调用$callback();

必须改为致电call_user_func(__NAMESPACE__.'\\'.$callback);

有时会变得很棘手;)

【讨论】:

  • 这是一个很好的观点,我也偶然发现了这个问题并且被结果激怒了。谢谢。
【解决方案2】:

在这里工作正常:

php > function foo() { echo 'foo!'; }
php > $bar = 'foo';
php > call_user_func($bar);
foo!
php > $bar();
foo!

您是否确认您的testRoute() 确实返回true?如果没有,那么您的“自动加载器”将永远不会被调用。

【讨论】:

  • @Marc B:是的,因为在条件语句中,如果我将 $callback() 替换为 homepage_display(),那么它可以工作。如果我打印 $callback,它会打印字符串“homepage_display”...奇怪的行为。
  • 喜欢你如何使用引号来表达你的“自动加载器”
猜你喜欢
  • 1970-01-01
  • 2015-05-02
  • 1970-01-01
  • 2012-02-07
  • 2011-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多