作者: laruence( ) 本文地址: http://www.laruence.com/2012/08/16/2709.html 转载请注明出处 最近, 我提交的关于finally的rfc:supports finally keyword已经提交到了php主干, 今天就给大家介绍一下这个新特性的背景, 和使用方法. 关于这个特性的需求, 最早
作者: laruence()本文地址: http://www.laruence.com/2012/08/16/2709.html转载请注明出处 最近, 我提交的关于finally的rfc:supports finally keyword已经提交到了php主干, 今天就给大家介绍一下这个新特性的背景, 和使用方法.
关于这个特性的需求, 最早是在2005年提出来的: fr #32100, 但一直没有人去实现它. 上个月又有人提出来, 我就是抱着试试的态度去实现了一下, 因为有人告诉我, 一直没有实现, 有一个原因是因为很难实现(或许对于一个码农来说, 喜欢挑战难题, 是天性, 呵呵)..
对于现在的php来说, 如果我们需要在发生我们当前不能处理的异常的时候, 做一些工作, 那么就会写下类似于这样代码:
function anonymous () { try { function_may_throw_exception(); } catch (exception $e) { clearup(); throw $e; } clearup();}
我们看到, 我们需要显式的写俩便clearup(). 那么finally就可以解决这个问题.
finally并不是php的原创, c#, javascript, java..等等其他语言都有, php的finally和其他的语言相似.
对于finally来说, 一个比较容易让人迷惑的地方就是在finally中return, 因为finally必须保证一定被执行, 所以如果我们在try中return了, finally也会被调用, 那么如果finally也return呢? 到底最后的return的值是那个呢? 在php中来说, 如果在finally中return, 那么就会覆盖原有的return值.
会得到int(2).
finally结合异常, return, 和try catch finally嵌套的话, 流程确实有点绕, 这也是为什么一直没有被人能实现的一个原因, 不过让我们看看这个finally执行流程图(来自: finally getting finally in php?), 会对我们理解这个流程会有帮助:
finally处理流程
在有了finally以后, 文章开头的例子就可以写作:
function anonymous () { try { function_may_throw_exception(); } finally { clearup(); }}
这样的特性, 对于一些代码洁癖者来说, 会舒服很多
代码已经提交到了php的主干, 不过等大家能用到, 估计最早也得明年了 (伴随php5.5).
comments2012/08/16, jimliu writes: 第二段代码中的catch疑为finally:)2012/08/16, 雪候鸟 writes: @jimliu thanks :)2012/08/16, dk writes: 越来越像java了2012/08/16, demon writes: 在一起,在一起2012/08/16, fc_lamp writes: “在php中来说, 如果在finally中return, 那么就会覆盖原有的return值.”2012/08/16, ayanamist writes: dalvik中对finally的处理是很简单粗暴的,把finally块在try和catch中各写一遍,并把里面所有的return置底,保证finally对应代码在return前执行。不知道php是不是同样处理的……2012/08/16, jrsjeff writes: 这个的确很简洁2012/08/17, joseph writes: 看完最后一段,是不是意味着明年将发布5.5版本?2012/08/17, assad writes: 很讨厌php面向对象,学java又学不像,搞不好就是东施效颦了。很多鸡肋的东西。2012/08/22, heihei writes: 在try和finally都return的情况下:如果在try里面return语句里面做了操作,那么还有效吗?不是是try里面的return就不执行了?2012/08/30, crazy writes: 请问php源码,怎么看啊。我下载了源码,都是不知从何看起。比如,看某个函数的实现等等。有没有相关的介绍。求指点啊。2012/08/30, 奇言妙事-文学奇谈小小说阅读xlinblog.sinaapp.com » php & “data” url scheme writes: [...] php的新特性finally [...]2012/08/31, 奇言妙事-文学奇谈小小说阅读xlinblog.sinaapp.com » 关于yaf的一些说明 writes: [...] php的新特性finally [...]2012/12/12, php5的新特性-finally | 仰天大笑出门去 writes: [...] 源地址: http://www.laruence.com/2012/08/16/2709.html [...]2013/04/28, php浮点数的一个常见问题的解答 | 午后小憩 writes: [...] php的新特性finally [...]2013/04/30, php5.5或将引入generators | 午后小憩 writes: [...] php的新特性finally [...]2013/05/01, php的新特性finally | 午后小憩 writes: [...] 本文地址: http://www.laruence.com/2012/08/16/2709.html [...]2013/05/02, 让php更快的提供文件下载 | 午后小憩 writes: [...] php的新特性finally [...]copyright © 2010 风雪之隅 版权所有, 转载务必注明. 该feed只供个人使用, 禁止未注明的转载或商业应用. 非法应用的, 一切法律后果自负. 如有问题, 可发e-mail至my at laruence.com.(digital fingerprint: 73540ba0a1738d7d07d4b6038d5615e2)