Я знаю, что можно сделать следующее с 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" }
Ссылки:
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.