zoukankan      html  css  js  c++  java
  • PHP匿名函数、闭包、function use

    匿名函数,也叫闭包函数(closures) ,允许临时创建一个没有制定名称的函数。最常用作回调函数(callback)参数的值。

    闭包函数也可以作为变量的值来使用。PHP将会自动把此种表达式转换成内置类 Closure 的对象实例。把一个 Closure 对象赋值给一个变量的方式与普通变量赋值的语法一样,最后也要加上分号。

    匿名函数变量赋值实例:
    <?php
    $printString = function($arg){
    echo $arg;
    };

    $printString('hello world');
    //输出 hello world

    闭包函数继承父作用域中的变量。任何此类变量都应该用 use 语言结构传递进去。

    从父作用域继承变量:
    <?php
    //定义变量
    $message = 'hello world';
    //匿名函数变量赋值
    $example = function(){
    var_dump($message);
    };
    //执行后输出 Notice: Undefined variable
    $example();

    在未使用关键字use 时,PHP不能在匿名函数中调用所在代码上下文变量。
    <?php
    //定义变量
    $message = 'hello';
    //匿名函数继承父作用域的变量($message)
    $example = function() use ($message){
    var_dump($message);
    };
    //输出 string 'hello' (length=5)
    echo $example();
    //同样输出 string 'hello' (length=5)
    $message = 'world';
    echo $example();

    使用关键字use时,PHP可以在调用匿名函数中调用所在代码上下文的变量,但为什么第二次调用没有发生变化哪?
    是因为匿名函数可以保存所在代码块上下文的一些变量和值(即:闭包函数将会保存第一次继承的父作用域的变量和值),值传递只是传递继承父作用域中变量和值的一个副本。

    要想改变父作用域的值并体现在匿名函数调用中,该怎么办哪?
    我们要用引用传递(即:在变量前面添加&),如下所示:
    <?php
    //定义变量
    $message = 'hello';
    //匿名函数继承父作用域的变量($message)
    $example = function() use (&$message){
    var_dump($message);
    };
    //输出 string 'hello' (length=5)
    echo $example();
    //输出 string 'world' (length=5)
    $message = 'world';
    echo $example();

    同样闭包函数也可以接受常规参数的传递,如下所示:

    <?php
    //定义变量
    $message = 'hello';
    $message2 = 'hello2';
    //匿名函数继承父作用域的变量($message)
    $example = function($arg) use (&$message2, $message){
    var_dump($message2 . ' ' . $message . ' ' . $arg);
    };
    echo $example('world');
    $message2 = 'world';
    //输出 string 'hello world' (length=11)
    echo $example('world');

  • 相关阅读:
    剑指Offer-11.二进制中1的个数(C++/Java)
    剑指Offer-10.矩形覆盖(C++/Java)
    剑指Offer-9.变态跳台阶(C++/Java)
    UVA 1608 Non-boring sequence 不无聊的序列(分治,中途相遇)
    UVA1607 Gates 与非门电路 (二分)
    UVA 1451 Average平均值 (数形结合,斜率优化)
    UVA 1471 Defense Lines 防线 (LIS变形)
    UVA 1606 Amphiphilic Carbon Molecules 两亲性分子 (极角排序或叉积,扫描法)
    UVA 11134 FabledRooks 传说中的车 (问题分解)
    UVA 1152 4 Values Whose Sum is Zero 和为0的4个值 (中途相遇)
  • 原文地址:https://www.cnblogs.com/WebLinuxStudy/p/11840797.html
Copyright © 2011-2022 走看看