IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

PHP的新特性finally

风雪之隅 2012-08-17 13:14:43 累计浏览 1,732 次
本机暂存

最近, 我提交的关于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值.

<?phpfunction anonymous() {    try {       return 1;    } finally {       return 2;    }} var_dump(anonymous());

会得到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).

同分类推荐文章

  1. 等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
  2. Go 实验特性详解 (2026-06-21 10:05:27)
  3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

查看更多 后端 文章 →

建议继续学习

  1. 使用gettext来支持PHP的多语言 (累计阅读 39,270)
  2. WordPress插件开发 -- 在插件使用数据库存储数据 (累计阅读 29,164)
  3. Paypal接口详细代码(PHP版,非API接口) (累计阅读 19,408)
  4. 我的PHP,Python和Ruby之路 (累计阅读 13,150)
  5. include(“./file.php”)和include(“file.php”)区别 (累计阅读 12,791)
  6. 15个最好的免费开源电子商务平台 (累计阅读 12,541)
  7. Redis消息队列的若干实现方式 (累计阅读 12,088)
  8. 到底什么是MVC? (累计阅读 11,870)
  9. 整理了一份招PHP高级工程师的面试题 (累计阅读 11,710)
  10. Rolling cURL: PHP并发最佳实践 (累计阅读 11,488)