- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
PHP5 3闭包特性及应用详解 原文
PHP5 3闭包特性及应用详解 原文
[转载]PHP5.3闭包特性及应用详解(原文:)2011-03-22 14:-11-24作者:编辑:崔晓帆今年7月发布的PHP 5.3版本带来了很多新的特性,其中比较惹眼的特性之一就是支持了闭包;51CTO曾经发布的《PHP 5.3闭包语法初探》一文也受到了PHP开发者的欢迎。
那么以后,我们也可以和那帮写Ruby、Javascript等等高科技语言的家伙们一样,写出非常酷的代码吗?呃,其实大部分情况下是可以的,而有些方面还是令人非常的困扰,下面慢慢道来。
很多语言的都提供了非常优雅和漂亮的操作数组的方法。在下面的例子中,会使用PHP5.3闭包特性以及其他语言提供的闭包功能,用于展示如何客观的操作迭代数组。
译注:原文作者比较火星,我不了解Groovy以及Scala语言,所以这里我加上Javascript的实现。
在开始之前先说明下,本例子仅仅是阐明观点,并没有考虑性能等其他方面的因素。
货比三家
用个简单的例子开始,有下面个数组:
$nums=array(10,20,30,40);
需要找出数组中大于15的项。那么,不考虑闭包的情况下,我们或许会这样写:
$res=array();foreach($nums as$n){if($n 15){$res=$n;}}
如果语言本身有闭包支持的,那么或许会这样写(Groovy语言)
def res=nums.findAll{it 15}或者使用Scala语言
val res=nums filter(_ 15)译注:Javascript 1.6的话会是如下
var res=nums.filter(function(c){return c15});
因为循环操作已被抽象起来,所以可以看到Groovy、Scala(以及Javascript)都很漂亮得用一行就可以搞定。
当然,如果使用PHP5.3的闭包,也可以做到
$res=array_filter($nums,function($v){return$v 15;});
PHP在这方面使用了比Scala更多的字符,但对比先前的例子,它更简短并且能更好得阅读。
顺便说下,上面的PHP代码实际上是使用了Lambda解析式,并不是个真正的闭包,这个并不是我们目前关注的重点。详细阐述PHP闭包以及Lambda解析式的资料,可以参考这里。
目前看来感觉都还不错,那么我们再的题目增加点难度:找到所有大于15的项,然后乘以2再加上作用域中的的某个变量值以后再返回。
Groovy的实现:
def x=1def res=nums.findAll{it 15}.collect{it*2+x}
Scala的实现:
val x=1val res=nums filter(_ 15)map(_*2+x)
PHP的实现:
$x=1;$res=array_map(function($v)use($x){return$v*2+$x;},array_filter($nums,function($v){return$v 15;}));
光从代码量方面,现在看起来PHP与其他语言有出入了。先抛开代码字面上本身的审美不谈,上面的PHP代码还有个额外的问题。
例如,如果需要使用数组的键而非值作比较,怎么办?是的,上面的代码就办不到了。同时,从语法角度上说,上面的代码非常难以阅读。
返璞归真,这时还是得返回老土的思路去解决问题:
$x=1;$res=array();foreach($nums as$n){if($n 15){$res=$n*2+$x;}}
这样看起来又很清楚了。但这个时候你或许又会迷惑了:那还瞎折腾啥,这不就是个数组操作吗?。
是的,好戏还在后头。这个时候该让PHP的某些高级特性出场,来搞定这看似有自残倾向的无聊问题。
ArrayObject–对数组的封装
PHP有个称作SPL的标准库,其中包含了个叫做ArrayObject的类,它能提供像数组一样操作类的功能,例如
$res=new ArrayObject(array(10,20,30,40));foreach($res as$v){echo$vn;}
ArrayObject是个内置的类,所以你可以像其他类类操作一样封装它。
Arr-包上糖衣
既然我们已经有了ArrayObject以及闭包这些特性,我们就可以开始尝试封装它:
class Arr extends ArrayObject{static function make($array){return new self($array);}function map($func){$res=new self();foreach($this as$k=$v){$res[$k]=$func($k,$v);}return$res;}fun
原创力文档


文档评论(0)