Вы наверно слышали о новых особенностях, которые ожидают нас в PHP 5.3, но кто знает где можно их использовать в реальном программировании? Я потратил немного времени чтобы изучить их и решил привести несколько примеров.
 

Лямбда функции и замыкания.


Это анонимные функции которые имеют не значительные  отличия. Эти функции более гибкие чем обычные функции и могут быть записаны в переменную или определены там где они нужны.Использование анонимных функций возможно даже в pre-5.3 PHP. Их можно создать при помощи функции  create_function(). Но это громоздко, некрасиво и ненадежно. PHP 5.3 даёт нам возможность делать это в более натуральном и красивом виде.
 

Лямбда функции

  • Это анонимные функции
  • Могут быть объявлены на лету
  • Могут быть присвоены переменной
  • Могут быть переданы в функцию как параметр
 Примеры использования:
<?php<br>$lamda = function() { print “Hello World!”; }<br><br>$lamda();<br><br>call_user_func($lamda);<br>call_user_func_array($lamda,array());<br>?><br><br><?php<br>$list = array(22,4,19,78);<br>usort(<br>  $list,<br>  function($a,$b){<br>        if ($a==$b) return 0;<br>        return ($a < $b)?-1:1;<br>    }<br>);<br>print_r($list);<br><br>print_r(array_map(<br>    function ($sn){return ($n * $n * $n);},<br>    array(1,2,3,4,5,6)<br>));<br>?><br><br>* This source code was highlighted with Source Code Highlighter.
 

Замыкания

  • Это анонимные функции
  • Могут быть объявлены на лету
  • Могут быть присвоены переменной
  • Могут быть переданы в функцию как параметр
  • Могут использовать переменные объявленные  вне функции
 Пример использования:
<?php
  $string = “Hello World!”;
  $closure = function() use ($string) {print $string; };
  $closure();
?>
<?php
  function getClosure(){
    $string = “Hello World!”;
    return function() use ($string) {print $string; };
}
$closure = getClosure();
$closure();
?>


* This source code was highlighted with Source Code Highlighter.
 

Различия между использованием use() и globals


Вы можете предложить что вместо use() будет лучше использовать globals. Да, конечно, в простых случаях использования той или иной методики идентичны, но есть и другие случаи.Представим себе что у нас есть функция, и в ней есть локальная переменная. И мы хотим использовать эту переменную в замыкании. В этом случае, нам нужно использовать оператор  use(). Если бы мы использовали globals то замыкание будет смотреть в массиве $globals и не найдет нашей переменной. С помощью use() локальная переменная может быть использована в теле замыкания.
 

Другие случаи использования

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

И напоследок


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