Home > php教程 > php手册 > body text

PHP的新特性finally

WBOY
Release: 2016-06-06 20:07:29
Original
1613 people have browsed it

作者: Laruence( ) 本文地址: http://www.laruence.com/2012/08/16/2709.html 转载请注明出处 最近, 我提交的关于finally的RFC:Supports finally keyword已经提交到了PHP主干, 今天就给大家介绍一下这个新特性的背景, 和使用方法. 关于这个特性的需求, 最早

  • 作者: Laruence(PHP的新特性finally PHP的新特性finally PHP的新特性finally PHP的新特性finally)
  • 本文地址: 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();
}
Copy after login

我们看到, 我们需要显式的写俩便clearup(). 那么finally就可以解决这个问题.

finally并不是PHP的原创, C#, Javascript, Java..等等其他语言都有, PHP的finally和其他的语言相似.

对于finally来说, 一个比较容易让人迷惑的地方就是在finally中return, 因为finally必须保证一定被执行, 所以如果我们在try中return了, finally也会被调用, 那么如果finally也return呢? 到底最后的return的值是那个呢? 在PHP中来说, 如果在finally中return, 那么就会覆盖原有的return值.

<?php function anonymous() {
    try {
       return 1;
    } finally {
       return 2;
    }
}

var_dump(anonymous());
Copy after login

会得到int(2).

finally结合异常, return, 和try catch finally嵌套的话, 流程确实有点绕, 这也是为什么一直没有被人能实现的一个原因, 不过让我们看看这个finally执行流程图(来自: Finally Getting finally In PHP?), 会对我们理解这个流程会有帮助:

Finally处理流程

在有了finally以后, 文章开头的例子就可以写作:

function anonymous () {
   try  {
      function_may_throw_exception();
   } finally {
      clearup();
   }
}
Copy after login

这样的特性, 对于一些代码洁癖者来说, 会舒服很多 :)

代码已经提交到了PHP的主干, 不过等大家能用到, 估计最早也得明年了 (伴随PHP5.5).


Comments

  • 2012/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)
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Recommendations
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!