zoukankan      html  css  js  c++  java
  • php中的匿名函数和闭包

    一:匿名函数 (在php5.3.0 或以上才能使用)

         php中的匿名函数(Anonymous functions), 也叫闭包函数(closures), 允许指定一个没有名称的函数。最常用的就是回调函数的参数值。(http://php.net/manual/zh/functions.anonymous.php

         匿名函数的定义:

    1 $closureFunc = function(){
    2 
    3     ....
    4 
    5  };

     eg: 把匿名函数赋值给变量,通过变量来调用

    1  $closureFunc = function($str){
    2 
    3    echo $str;
    4 
    5   };
    6 
    7   $closureFunc("hello world!");

     输出: hello world!

    二:闭包

     2.1  将匿名函数放在普通函数中,也可以将匿名函数返回,这就构成了一个简单的闭包 

    1 function closureFunc1(){
    2     $func = function(){
    3         echo "hello";
    4     };
    5     $func();
    6 }
    7 closureFunc1();
    8 //输出: hello

    2.2  在匿名函数中引用局部变量

    1 function closureFunc2(){
    2     $num = 1;
    3     $func = function(){
    4         echo $num;
    5     };
    6     $func();
    7 }
    8 closureFunc2();
    9 //Notice: Undefined variable: num

    上面的函数运行后,会报Notice错误,说明我们不能在匿名函数中这样使用局部变量,这时候就要引用一个php的关键字 use, 代码如下

    1 function closureFunc2(){
    2     $num = 1;
    3     $func = function() use($num){
    4         echo $num;
    5     };
    6     $func();
    7 }
    8 closureFunc2();
    9 //输出: 1

     2.3  返回匿名函数

     1 function closureFunc3(){
     2     $num = 1;
     3     $func = function() use($num){
     4         echo $num;
     5     };
     6     return $func;
     7 }
     8 $func = closureFunc3(); //函数返回匿名函数
     9 $func(); //然后我们在用$func() 调用
    10 //输出: 1

    2.4 当我们在返回匿名函数时候怎么给匿名函数传参呢? 其实跟普通函数传参数一样

     1 function closureFunc4(){
     2     $num = 1;
     3     $func = function($str) use($num){
     4         echo $num;
     5         echo "
    ";
     6         echo $str;
     7     };
     8     return $func;
     9 }
    10 $func = closureFunc4();
    11 $func("hello, closure4");
    12 //输出:
    13 //1
    14 //hello, closure4

    2.5 怎么用闭包来改变上下文引用的变量值?

     1 function closureFunc5(){
     2     $num = 1;
     3     $func = function() use($num) {
     4         echo "
    ";
     5         $num++;
     6         echo $num;
     7     };
     8     echo "
    ";
     9     echo $num;
    10     return $func;
    11 }
    12 $func = closureFunc5();
    13 $func();
    14 $func();
    15 $func();
    16 //输出:
    17 // 1
    18 // 2
    19 // 2
    20 // 2

    看上面的输入结果,显然没有达到目的, 其实只要加一个 & 引用符号就可以了

     1 function closureFunc5(){
     2     $num = 2;
     3     $func = function() use(&$num) {
     4         echo "
    ";
     5         $num++;
     6         echo $num;
     7     };
     8     echo "
    ";
     9     echo $num;
    10     return $func;
    11 }
    12 $func = closureFunc5();
    13 $func();
    14 $func();
    15 $func();
    16 //输出:
    17 // 2
    18 // 3
    19 // 4
    20 // 5

    2.6 把匿名函数当作参数传递

    1 function callFunc($func){
    2     $func("argv");
    3 }
    4 
    5 callFunc(function($str){
    6     echo $str;
    7 })
    8 //输出:
    9 // argv

    参考:

    http://www.cnblogs.com/yjf512/archive/2012/10/29/2744702.html 为什么要引入闭包

    http://blog.csdn.net/lgg201/article/details/6127564  php 5.3.0 的function() use() {}

    http://www.cnblogs.com/starlion/p/3894578.html 转载于

    既不回头,何必不忘; 既然无缘,何须誓言; 今日种种,逝水无痕; 明夕何夕,君已陌路;
  • 相关阅读:
    转换流与标准的输入输出流
    缓冲流
    节点流(文件流) FileInputStream & FileOutputStream & FileReader & FileWriter
    IO流概述
    File类的使用
    枚举&注解
    泛型的使用
    Collections工具类
    Map接口之HashMap,LinkedHashMap,TreeMap
    MySQL 高可用之MHA
  • 原文地址:https://www.cnblogs.com/zyjfire/p/7084241.html
Copyright © 2011-2022 走看看