Закрытие объектов внутри массивов до PHP 5.3

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

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

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

Если вы хотите создать анонимный в 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 ); 

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

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

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

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

Первый путь

 $func(); 

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

 call_user_func($func); 

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

 function primitiveArrayStep(&$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(&$array[$i]); } else { # If not, do something here } } } 

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

 $array = array('a', 'b', 'c'); $myFunction = create_function('&$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" } 

Ссылки:

  • Callbacks
  • create_function()
  • call_user_func()
  • is_callable()

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

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

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

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

 $func = create_function( '$y', 'echo $y;' ); //similar to $func = function( $y ){ echo $y }; 
 $exampleArray = array( 'func' => create_function('', 'echo "this is an example"'); ); 

create_function

А как же просто создать класс с «func» как метод класса? Будет работать до или после 5.3.