Объекты закрытия в массивах до PHP 5.3

#php #anonymous-function #php-5.2

#php #анонимная функция #php-5.2

Вопрос:

Я знаю, что можно сделать следующее с PHP 5.3 (анонимные функции), но есть ли аналогичная альтернатива в более старой версии PHP (до версии 5.3)?

   $exampleArray = array(  
    'func' => function() {  
      echo 'this is an example';  
      }
  

Возможно ли это сделать с помощью __call или сначала ввести тип функции как (объекта)? Кроме того, я попытался сделать функцию неанонимной, присвоив ей имя, но, похоже, это не сработало.

Ответ №1:

Если вы хотите создать анонимную версию в PHP < 5.3, вы можете использовать create_function функцию. Также здесь есть интересная информация об обратных вызовах (может оказаться полезной).

Пример использования create_function

 # This (function in other variable is only for cleaner code)
$func = create_function('', "echo 'This is example from anoymus function';");

$exampleArray = array(
  'func' => $func
  );
  

Но вы можете сделать то же самое, используя приведенный выше код, альтернативным способом:

 # Create some function
function func()
{
   # Do something
   echo 'This is example';
}
# Save function name
$func = 'func';
  

Приведенный выше код создает функцию, которая что-то делает, затем мы сохраняем имя функции в переменной (может быть передано как параметр и т.д.).

Вызываем функцию, когда мы знаем только ее имя:

Первый способ

 $func();
  

Альтернатива

 call_user_func($func);
  

Итак, пример, который соединяет все вышеописанное:

 function primitiveArrayStep(amp;$array, $function)
{
    # For loop, foreach can also be used here
    for($i = 0; $i < count($array);$i  )
    {
         # Check if $function is callable             
          if( is_callable($function) )
          {
               # Call function
           $function(amp;$array[$i]);
          }
          else
          {
               # If not, do something here
          }

    }    
}
  

И использование вышеупомянутой функции:

 $array = array('a', 'b', 'c');

$myFunction = create_function('amp;$e', '$e = $e . " and i was here";');

primitiveArrayStep($array, $myFunction);

echo '<pre>';
var_dump($array);
  

ВОЗВРАТ:

 array(3) {
  [0]=>
  string(16) "a and i was here"
  [1]=>
  string(16) "b and i was here"
  [2]=>
  string(16) "c and i was here"
}
  

Ссылки:

Ответ №2:

Да, можно создавать функции lamda в PHP до версии 5.3, используя create_function. Невозможно создать замыкания, хотя в вашем вопросе упоминается, но фактически не используется.

Закрытие — это функция lamda, которая имеет доступ (закрывается поверх) переменной из охватывающей ее области:

 $t = new Thingy;
$func = function( $y ) use( $t ) {
    //$t is available here when this function is called;
}
  

Функция lamda — это анонимная функция, полезная для хранения в переменной или передачи в качестве аргумента и т.д. Вы можете использовать create_function() версию 5.3 следующим образом:

 $func = create_function( '$y', 'echo $y;' );

//similar to

$func = function( $y ){ echo $y };
  

Ответ №3:

 $exampleArray = array(
    'func' => create_function('', 'echo "this is an example"');
);
  

create_function

Комментарии:

1. Вдохновляющий ответ. Я многому научился. Такое ощущение, что этот ответ заслуживает гораздо большего внимания. Такие возможности PHP.

Ответ №4:

Как насчет простого создания класса с ‘func’ в качестве метода класса? Будет работать до или после 5.3.