PHP动态调用含变量命名的匿名函数问题求助
动态调用对应主题的匿名函数解决方案
首先,咱们来拆解下你遇到的问题:你定义的是赋值给变量的匿名函数,不是传统的命名函数,所以之前直接用字符串拼接后调用的方式没法正确定位到这些变量里的函数。下面给你两种可行的实现方式:
方式一:使用变量变量调用(适配你现有代码结构)
你的测试代码里已经把函数存在了$mb_theme_action_mbinout这样的变量里,那可以通过变量变量来定位并调用它:
// 你的测试匿名函数(保持不变) $mb_theme_action_mbinout = function() { $mb_locations = array(); for ($i = 1; $i <= 10; ++$i) { $mb_locations[] = array( 'a' => 'Test item ' . $i, 'b' => 'loc0' . $i, 'c' => 'group1' ); } var_dump( $mb_locations ); }; // 拼接出目标函数的变量名 $targetFuncVar = 'mb_theme_action_' . get_option('stylesheet'); // 先检查变量是否存在且是可调用的函数,避免报错 if (isset($$targetFuncVar) && is_callable($$targetFuncVar)) { // 调用匿名函数 $$targetFuncVar(); }
这里的$$targetFuncVar等价于${$targetFuncVar},也就是直接指向$mb_theme_action_mbinout这个变量,加上()就能执行里面的匿名函数了。
方式二:用数组统一管理主题函数(更规范易维护)
如果后续要加更多主题的函数,推荐用数组来集中管理,避免全局变量满天飞,也更直观:
// 把所有主题对应的函数放到一个数组里,键用主题的stylesheet名称 $themeSpecificActions = [ 'mbinout' => function() { $mb_locations = array(); for ($i = 1; $i <= 10; ++$i) { $mb_locations[] = array( 'a' => 'Test item ' . $i, 'b' => 'loc0' . $i, 'c' => 'group1' ); } var_dump( $mb_locations ); }, // 新增其他主题的函数直接在这里加 'my-custom-theme' => function() { echo '这是自定义主题的专属逻辑'; } ]; $currentTheme = get_option('stylesheet'); // 检查当前主题是否有对应的函数,有就调用 if (isset($themeSpecificActions[$currentTheme]) && is_callable($themeSpecificActions[$currentTheme])) { $themeSpecificActions[$currentTheme](); }
为啥之前的写法失败了?
- 第一种写法里,你把
$theme定义成了一个输出字符串的函数,它只是打印了函数名,根本没尝试执行目标函数。 - 第二种写法里,
$theme是个字符串,直接$theme()会去找命名函数(比如function mb_theme_action_mbinout() {}这种),但你定义的是赋值给变量的匿名函数,所以PHP找不到;而你试的$$theme()其实语法上可以,但如果没做存在性检查,或者变量作用域有问题(比如函数定义在局部),就会报错。
内容的提问来源于stack exchange,提问作者markb
相关产品推荐
相关产品推荐

