快速业务通道

谈PHP闭包特性在实际应用中的问题

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-23

  PHP 5.3版本跟随了很多新特性,其中比较惹眼的特性之一就是支持了闭包。文章将使用PHP 5.3 以及其他语言提供的闭包功能,用于展示如何“客观的”操作迭代数组。在开始之前先说明下,本例子仅仅是阐明观点,并没有考虑性能等其他方面的因素。

“货比三家”

用个简单的例子开始,有下面个数组:

  1. $nums = array(10, 20, 30, 40); 
  2.  

需要找出数组中大于15的项。那么,不考虑闭包的情况下,我们或许会这样写:

  1. $res = array();foreach ($nums as $n)   
  2. {      
  3. if ($n > 15)   
  4. {          
  5. $res[] = $n;      
  6. }} 

如果语言本身有闭包支持的,那么或许会这样写(Groovy 语言)

  1. def res = nums.findAll { it > 15 } 
  2.  

或者使用Scala语言:

  1. val res = nums filter (_ > 15) 
  2.  

译注:Javascript 1.6 的话会是如下:

  1. var res = nums.filter(function(c){return c > 15}); 
  2.  

因为循环操作已被抽象起来,所以可以看到 Groovy 、Scala (以及 Javascript) 都很漂亮得用一行就可以搞定。当然,如果使用 PHP5.3 的闭包,也可以做到

  1. $res = array_filter($nums, function($v) { return $v > 15; }); 
  2.  

PHP在这方面使用了比Scala更多的字符,但对比先前的例子,它更简短并且能更好得阅读。

顺便说下,上面的PHP代码实际上是使用了Lambda解析式,并不是个真正的闭包,这个并不是我们目前关注的重点。目前看来感觉都还不错,那么我们再的题目增加点难度:找到所有大于15的项, 然后乘以2再加上作用域中的的某个变量值以后再返回。

Groovy的实现:

  1. def x = 1def res = nums .findAll { it > 15 } .collect { it * 2 + x } 
  2.  

Scala的实现:

  1. val x = 1val res = nums filter (_ > 15) map (_ * 2 + x)
  2.  

Javascript 的实现:

  1. var i = 1;var res = nums.filter(function(c)
  2. {return c > 15}).map(function(c){return c * 2 + i}); 

PHP的实现:

  1. $x = 1;$res = array_map(      
  2. function($v) use ($x) { return $v * 2 + $x;   
  3. },    array_filter(        $nums,        function($v) { return $v > 15; }  
  4.  
  5. )); 

光从代码量方面,现在看起来PHP与其他语言有出入了。先抛开代码字面上本身的审美不谈,上面的PHP代码还有个额外的问题。例如,如果需要使用数组的键而非值作比较,怎么办?是的,上面的代码就办不到了。同时,从语法角度上说,上面的代码非常难以阅读。返璞归真,这时还是得返回老土的思路去解决问题:

  1. $x = 1;$res = array();foreach ($nums as $n)   

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号