PHP 回调函数

Reading time ~1 minute

前两天,在写程序的时候,有个函数需要传一个回调函数,但是,我需要在这个回调函数的内部使用外面的一些变量,同时需要获取该函数的最终计算结果。

首先,获取计算结果还是比较容易的,查看那个函数的实现发现,其返回的结果就是传入的回调函数的返回结果,那么我们就可以直接在回调函数中返回即可。

但是,接下来想要使用外面的变量的时候就没有这么一帆风顺了。首先直接我以为是像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中自动捕获变量时极易出现的相互引用而导致的内存泄露。

挂载网络文件夹后网络故障时文件操作命令卡死

挂载 NFS 或者 Samba 的时候,经常会由于网络故障导致挂载好的链接断掉。此时如果尝试进行 ls、cd、df 等各种命令,只要与此目录沾上边,就会卡住。如果使用了类似 oh-my-zsh 这种配置的,只要在网络目录中,弹出命令提示符前就会直接卡住。这个时候第一反应就是...… Continue reading

路由折腾记 第四弹

Published on September 02, 2017