Php: создание функций в цикле for () - PullRequest
3 голосов
/ 21 января 2010

Кто-нибудь знает, как я мог написать функцию, которая могла бы создавать другие функции, используя содержимое переменной для ее имени?

Вот основной пример того, о чем я говорю в php:

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

Кто-нибудь знает язык, который позволил бы мне это сделать?

Ответы [ 5 ]

6 голосов
/ 21 января 2010

Вы можете создавать анонимные функции в PHP, используя create_function(). Вы можете назначить каждую анонимную функцию переменной $newfunctionname и выполнить ее, используя call_user_func():

$newfunctionname = "Node".$i;
$$newfunctionname = create_function('$input', 'echo $input;'); 
// Creates variables named Node1, Node2, Node3..... containing the function

Я думаю, что это самое близкое, что вы можете получить в PHP таким способом, который не выглядит как полный взлом.

Я не думаю, что можно определить функцию непосредственно из переменной. Мне бы это тоже не понравилось, потому что вы бы загрязняли пространство имен этими функциями. Если анонимные функции не работают, это требует объектно-ориентированного подхода.

2 голосов
/ 21 января 2010

Если вы используете PHP 5.3, вы можете использовать лямбда-выражения:

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

$node7('hello');
2 голосов
/ 21 января 2010

Вы можете использовать для этого 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

1 голос
/ 21 января 2010

Вы можете создавать функции на лету с помощью create_function () .

0 голосов
/ 21 января 2010

Зачем вам это нужно?

Также в 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, которые ничего не делают.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...