前两天,在写程序的时候,有个函数需要传一个回调函数,但是,我需要在这个回调函数的内部使用外面的一些变量,同时需要获取该函数的最终计算结果。
首先,获取计算结果还是比较容易的,查看那个函数的实现发现,其返回的结果就是传入的回调函数的返回结果,那么我们就可以直接在回调函数中返回即可。
但是,接下来想要使用外面的变量的时候就没有这么一帆风顺了。首先直接我以为是像swift的闭包一样,会自动捕获外部变量当时值,可是直接使用却发现并不是这样,完全没有捕获任何外部变量。
接下来我想通过给匿名函数添加参数的形式将外部变量传递进去,但是调用回调函数的时候,传递的参数并不能由我设置,于是乎我尝试将外部变量当做参数的默认值,可是语法还是不允许这样做。
最后,终于在php.net中的一个示例中找到了答案:
$callback = function ($quantity, $product) use ($tax, &$total) { $pricePerItem = constant(__CLASS__ . "::PRICE_" . strtoupper($product)); $total += ($pricePerItem * $quantity) * ($tax + 1.0); };
即在匿名函数定义的时候,后面使用use,来将上一级作用范围中的变量导入进匿名函数中,这样不仅可以使得里面得到外面的值,也能让里面对变量进行的修改反映到外面。
仔细想想,其实php这样的方式也挺好的,这样每一个传递的变量都是由我们自己在use中明确的,那么也就不至于出现像swift中自动捕获变量时极易出现的相互引用而导致的内存泄露。