PHP:在for()循环中创建函数

4

有没有人知道如何编写一个函数,能够使用变量的内容作为名称创建其他函数?

这是一个在php中实现的基本示例:

function nodefunctioncreator()
  {
    for ($i =1, $i < 10, $i++)
      {
      $newfunctionname = "Node".$i;
      function $newfunctionname()
        {
        //code for each of the functions
        }
      }
  }

有没有人知道一种语言可以让我做到这一点?

几乎所有的动态语言都支持这个功能,例如 LISP、Scheme 和 Smalltalk。而编译语言像 C 和 C++ 几乎从不支持。 - anon
你可以在所有(大多数?)动态语言中实现这个功能,比如JavaScript、Python等。 - Allain Lalonde
5个回答

6
你可以使用 create_function() 在 PHP 中创建匿名函数。你可以将每个匿名函数赋值给一个变量 $newfunctionname,并使用 call_user_func() 执行它:
$newfunctionname = "Node".$i;
$$newfunctionname = create_function('$input', 'echo $input;'); 
// Creates variables named Node1, Node2, Node3..... containing the function

我认为这是PHP中最接近的方法,而且看起来不像完全的黑客攻击。

我认为不可能直接从变量定义函数。如果这样做,它看起来不好,因为你将会用这些函数污染命名空间。如果匿名函数不起作用,那么需要采取面向对象的方法。


这在 PHP <=5.2.x 中是必需的。然而,5.3 提供了一个更清晰的解决方案。 - Lucas Oman
PHP 8 中不再支持 create_function - Arnaud

3

如果您正在使用PHP 5.3,您可以使用lambda表达式:

for ($i=0;$i<10;$i++) {
  $funcName = 'node'.$i;
  $$funcName = function ($something) {
    // do something
  }
}

$node7('hello');

2
您可能需要使用create_function来实现此功能。 示例:
$newfunc = create_function('$a,$b', 'return "ln($a) + ln($b) = " . log($a * $b);');
echo "New anonymous function: $newfunc\n";
echo $newfunc(2, M_E) . "\n";
// outputs
// New anonymous function: lambda_1
// ln(2) + ln(2.718281828459) = 1.6931471805599

示例来源:php.net


create_function 函数已经从最近的 PHP 版本中移除。 - Arnaud

1

-3

为什么你想要这样做呢?

在Javascript中也可以实现此功能:

function nodefunctioncreator(){
  var o = {};
  for(var i = 1, i < 10, i++) {
    o["Node" + i] = function(){
      //code for each of the functions
    }
  }
  return o;
}

调用该函数将返回一个包含函数 Node1、Node2、...、Node9 的对象,这些函数实际上什么也不做。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接