博弈
这个问题其实很难回答 - 这需要根据代码的上下文以及程序员自身等众多因素决定。其实 ,当我第一眼看见PHP的闭包实现时,我感觉似乎回到了那很久以前的Java时期,当时 我在开始使用匿名内置类anonymous inner classes)来实现闭包。当然,这虽然可以做到, 但看起来实在是些画蛇添足。PHP 闭包本身是没错,只是它的实现以及语法让我感到非常的困惑。
其他具有闭包特性的语言,它们可以非常方便的调用闭包并同时具有优雅的语法。在上面的例子中,在 Scala中使用传统的循环也可以工作,但你会这样写吗?而从另个方面,那么有人 说上面这个题目使用 PHP 的闭包也可以实现,但一般情况下你会这样写吗?
可以确定,PHP 闭包在些情况下可以成为锐利的军刀例如延时执行以及资源调用方面), 但在传统的迭代以及数组操作面前就显得有些为难。不要气馁不管怎么样, 返璞归真编写具有兼容性的、清爽的代码以及 API 是最重要的。
结束语
像所有后来加上的语法特性一样记得当年Java的Generics特性不?以及前几年的PHP OOP特性),它们都需要时间磨合以及最终稳定下来。随着PHP5.3甚至将来的PHP 6逐渐普及,越来越多的技巧和特性相信在不远的将来逐渐的被聪明的程序员挖掘出来。回到最初文章开头那个题目,对比:
- $res = Arr::make($nums)
- ->filter(function($k, $v)
- { return $v > 15; })
- ->map(function($k, $v)
- { return $v * 2; });以及
- val res = nums filter (_ > 15) map (_ * 2)
两者之间的区别。归根结底它们仅是语法而已,本质上都是殊途同归解决了同个问题。程序语言的应用特性不同,自然孰优孰劣也就无从比较。最后,这里有此篇文章的代码示例, 相信可以找到更多如何使用PHP进行函数式迭代当然不仅仅是这些)的心得。
文章转自李魁的博客,
原文地址:http://www.cahlk.com.cn/2010/984.shtml
PHP之友评论