php5.3的closure

之前还抱怨过php没有closure,只能凑活一下,结果前些天就看到5.3已经将closure加入了。php5.3的变化还真是大,看todo里的future release,那又是许多NB的功能。

先说说closure,最简单的说,就是匿名函数。

还是那个例子:

class ArrayList {
    private $arr;
    function __construct($arr) {
        $this->arr = $arr;
    }

    function each($call) {
        foreach ($this->arr as $item) {
            $call($item);
        }
    }
}
$arr = new ArrayList(array(1,2,3));
$arr->each(function ($item) {
    echo “[$item]n”;
});

真的闭包确实要比假闭包要漂亮多了

当然闭包不仅仅是个匿名函数,还要能够跨越定义和调用处的作用域。这方面,这次php5.3的实现要比javascript的闭包要清晰些,不过语法也就显得有些奇怪。

看例子:

function foo($prefix) {
    return functioin ($s) use ($prefix) {
        return $prefix . $s;
    }
}
$f1 = foo(‘test’);
print_r(array_map($f1, array(‘A’, ‘B’, ‘C’)));
$f2 = foo(‘hello’);
print_r(array_map($f2, array(‘A’, ‘B’, ‘C’)));

unescape,json_decode另类用法

javascript有个escape函数,虽然现在已经不建议使用,但还是会碰到许多escape过的字符串需要解码。因为javascript的escape实际上是个unicode编码,要转成utf8或者其他编码是很麻烦的。php5.2内置的json扩展除了用于json以外,其实也可以用来unescape。

json / javascript里的字符串在字符串常量的表示里,也可以用u5C71这样的方式,而escape的结果里,只是把那个 换成了 % 。所以,只要用类似下面的代码就可以转换回来。而对于u5C71这种形式的编码的串,只需要在两头加上双引号,然后json_decode就可以了。

 echo json_decode(str_replace(‘%’,’\’, ‘”%u4ECE%u524D%u6709%u5EA7%u5C71″‘));