mysql 匿名函数调用_匿名函数和闭包 - 金于虎的个人空间 - OSCHINA - 中文开源技术交流社区...

真正的匿名函数

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

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

###魔术方法__invoke

class Callme {

public function __invoke($phone_num) {

echo "Hello: $num";

}

}

$call = new Callme();

$call(13810688888); // "Hello: 13810688888

?>

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

$func = function() {

echo "Hello, anonymous function";

}

echo gettype($func); // object

echo get_class($func); // Closure

?>

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

#闭包的使用

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

匿名函数在定义的时候如果需要使用作用域外的变量需要使用如下的语法来实现:

use语法

$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语句的效果。

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

function getCounter() {

$i = 0;

return function() use($i) { // 这里如果使用引用传入变量: use(&$i)

echo ++$i;

};

}

$counter = getCounter();

$counter(); // 1

$counter(); // 1

?>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值