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

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

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

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


person Dominique    schedule 01.05.2011    source источник


Ответы (4)


Если вы хотите создать анонимный в 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(&$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"
}

Ссылки:

person Robik    schedule 01.05.2011

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

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

$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 };
person meouw    schedule 01.05.2011

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

create_function

person Zirak    schedule 01.05.2011
comment
Прекрасный ответ. Я так много узнал. Похоже, этот ответ заслуживает гораздо большего внимания. Такие возможности PHP. - person Benjamin Gruenbaum; 26.01.2014

А как насчет того, чтобы просто создать класс с func в качестве метода класса? Будет работать до или после 5.3.

person Scott C Wilson    schedule 01.05.2011