PHP的use关键字

March 31, 2013

今天试了一下Slim框架,准备弄个编辑器,第一次遇到use关键字。

Slim的路由通常由路径+匿名函数组成, 例如这样:

<?php

$app->get("/path/:arg", function($arg) {
   ...
});

怎样把$app传进路由里的匿名函数呢?

以前的我会用global:

$app->get("/path/:arg", function($arg) {
    global $app;
    ...
});

如果遇到不是全局的变量,global就无能为力了。

现在,我知道了use:

$app->get("/path/:arg", function($arg) use ($app) {
    ...
});

哦,PHP的匿名函数是不会自动捕获自由变量的,所以才要用use来传递从而实现闭包,这突然就让我想起C++里的lambda开头的那个[]。

例如Haskell里就会自动捕捉:

mkCounter = do
   counterRef <- newIORef (0::Int)
   return $ mofidyIORef counterRef (+1) >> readIORef counterRef >>= print

到了PHP就要自己选择:

function mkCounter() {
    $count = 0;

    return function() use (&$count) { // 按引用传递
        echo ++$count;
    };
}

有时候自动很方便,有时指明会更明确,虽然我更喜欢自动。

PS: 发现如果代码不加<?php ,php代码不会高亮。