Вы наверно слышали о новых особенностях, которые ожидают нас в PHP 5.3, но кто знает где можно их использовать в реальном программировании? Я потратил немного времени чтобы изучить их и решил привести несколько примеров.
Это анонимные функции которые имеют не значительные отличия. Эти функции более гибкие чем обычные функции и могут быть записаны в переменную или определены там где они нужны.Использование анонимных функций возможно даже в pre-5.3 PHP. Их можно создать при помощи функции create_function(). Но это громоздко, некрасиво и ненадежно. PHP 5.3 даёт нам возможность делать это в более натуральном и красивом виде.
Вы можете предложить что вместо use() будет лучше использовать globals. Да, конечно, в простых случаях использования той или иной методики идентичны, но есть и другие случаи.Представим себе что у нас есть функция, и в ней есть локальная переменная. И мы хотим использовать эту переменную в замыкании. В этом случае, нам нужно использовать оператор use(). Если бы мы использовали globals то замыкание будет смотреть в массиве $globals и не найдет нашей переменной. С помощью use() локальная переменная может быть использована в теле замыкания.
Как вы можете наблюдать, замыкания и лямда функции очень удобны если знать как их использовать. Конечно жаль что придется еще немного подождать перед выходом PHP 5.3. Но нужно отдать должное разработчикам PHP за столь нужные нововведения.
Лямбда функции и замыкания.
Это анонимные функции которые имеют не значительные отличия. Эти функции более гибкие чем обычные функции и могут быть записаны в переменную или определены там где они нужны.Использование анонимных функций возможно даже в 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 за столь нужные нововведения.