匿名函数和闭包

真正的匿名函数php

在PHP5.3引入的众多功能中, 除了匿名函数还有一个特性值得讲讲: 新引入的__invoke 魔幻方法。闭包

这个魔幻方法被调用的时机是: 当一个对象当作函数调用的时候, 若是对象定义了__invoke魔幻方法则这个函数会被调用, 这和C++中的操做符重载有些相似, 例如能够像下面这样使用函数

###魔术方法__invoke.net

<?php
class Callme {
    public function __invoke($phone_num) {
        echo "Hello: $num";
    }
}
 
$call = new Callme();
$call(13810688888); // "Hello: 13810688888
?>

#匿名函数的实现 前面介绍了将对象做为函数调用的方法, 聪明的你可能想到在PHP实现匿名函数的方法了,PHP中的匿名函数就的确是经过这种方式实现的。 咱们先来验证一下:code

<?php
$func = function() {
    echo "Hello, anonymous function";
}
 
echo gettype($func);    // object
echo get_class($func);  // Closure
?>

原来匿名函数也只是一个普通的类而已.对象

#闭包的使用ip

PHP使用闭包(Closure)来实现匿名函数, 匿名函数最强大的功能也就在匿名函数所提供的一些动态特性以及闭包效果,作用域

匿名函数在定义的时候若是须要使用做用域外的变量须要使用以下的语法来实现:get

use语法io

<?php
$name = 'TIPI Tea';
$func = function() use($name) {
    echo "Hello, $name";
}
 
$func(); // Hello TIPI Team
?>

#use说明 这个use语句看起来挺别扭的, 尤为是和Javascript比起来, 不过这也应该是PHP-Core综合考虑才使用的语法, 由于和Javascript的做用域不一样, PHP在函数内定义的变量默认就是局部变量, 而在Javascript中则相反, 除了显式定义的才是局部变量, PHP在变异的时候则没法肯定变量是局部变量仍是上层做用域内的变量, 固然也可能有办法在编译时肯定, 不过这样对于语言的效率和复杂性就有很大的影响。

这个语法比较直接, 若是须要访问上层做用域内的变量则须要使用use语句来申明, 这样也简单易读, 说到这里, 其实可使用use来实现相似global语句的效果。

匿名函数在每次执行的时候都能访问到上层做用域内的变量, 这些变量在匿名函数被销毁以前始终保存着本身的状态, 例如以下的例子:

<?php
function getCounter() {
    $i = 0;
    return function() use($i) { // 这里若是使用引用传入变量: use(&$i)
        echo ++$i;
    };
}
 
$counter = getCounter();
$counter(); // 1
$counter(); // 1
?>

参考来源

相关文章
相关标签/搜索