Pull to refresh

Программирование в PHP 5.3

Reading time3 min
Views716
Вы наверно слышали о новых особенностях, которые ожидают нас в 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 за столь нужные нововведения.  
Tags:
Hubs:
Total votes 33: ↑28 and ↓5+23
Comments26

Articles