Закрытие объектов в массивах до PHP 5.3 - PullRequest
4 голосов
/ 01 мая 2011

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

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

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

Ответы [ 4 ]

9 голосов
/ 02 мая 2011

Если вы хотите создать аноним в PHP <5.3, вы можете использовать функцию <a href="http://php.net/manual/en/function.create-function.php">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"
}

Ссылки:

6 голосов
/ 01 мая 2011

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

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

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

A lamda - это анонимная функция, полезная для хранения в переменной или передачи в качестве аргумента и т. д. Вы можете использовать create_function() pre5.3, как это:

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

//similar to

$func = function( $y ){ echo $y };
3 голосов
/ 01 мая 2011
$exampleArray = array(
    'func' => create_function('', 'echo "this is an example"');
);

create_function

0 голосов
/ 01 мая 2011

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

...