【问题标题】:PHP: define functions with variable namesPHP:用变量名定义函数
【发布时间】:2011-09-07 17:17:00
【问题描述】:

我有一个字符串数组,我想定义名称为这些字符串的函数。有没有办法在 PHP 中做到这一点?

$a = array("xxx", "yyy", "zzz");

如何以编程方式定义xxx()yyy()zzz()

非常感谢

【问题讨论】:

  • 假设您确实将这些字符串定义为函数,您将如何处理它们?
  • 它们是 CMS 中的钩子。我希望我的插件在每个钩子上都做同样的事情。
  • 匿名函数对你更有用吗? php.net/manual/en/functions.anonymous.php.
  • 这意味着您只想将它​​们声明为没有定义的函数(在这种情况下已经定义)。如果是这种情况,您不需要声明它们。只需将它们称为附加 () 与每个字符串和可能的参数。
  • @SavageGarden 不,我想定义它们,而不是调用它们

标签: php


【解决方案1】:

如果你真的需要,你可以在 eval 块中声明函数:

foreach ($a as $functionname)
eval('
        function '.$functionname.' () {
            print 123;
        }
');

但与仅在文件中声明函数相比,这会导致一些额外的解析时间速度损失。

【讨论】:

  • 由于它是用于严格开发的辅助模块,性能不是问题,所以我想我会使用这种方法。谢谢!
  • 实际上,我最终会从另一个 PHP 脚本生成我的 PHP 文件,这样会更干净。它是如此的元! :)
【解决方案2】:

你不知道,这是不可能的。

使用魔术方法技巧,您可以在实例对象上实现此目的(因此 $obj->xxx() 有效,请参阅:__call),但您不能基于变量名创建全局函数。

注意:我知道您可以使用 $var(),但这不是 OP 所要求的。

【讨论】:

  • 好的,谢谢。你有更多关于这个魔术方法的信息吗?
  • 我不确定这是否适用于我的情况(CMS 中的挂钩定义)。不过会试试的,谢谢。
  • @julien_c 让我猜猜!您可能在使用 Drupal 更新挂钩时问过这个问题?一团糟。你最后是怎么解决的?
【解决方案3】:
$a = array("xxx", "yyy", "zzz");

foreach($a as $functionname){
$code = <<< end
function $functionname(){
//your logic here for each function
}
end;
eval($code);
}

但请注意,不建议使用 Eval,您应该寻找其他方法。

【讨论】:

    猜你喜欢
    • 2015-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-14
    • 1970-01-01
    相关资源
    最近更新 更多