1. final的介绍

final可以用来修饰类和方法,当修饰类的时候,该类不能被继承,当修饰方法的时候,该方法不能被覆盖。final具有以下特性:
final用于声明方法和类,分别表示方法不可被覆盖、类不可被继承(不能再派生出新的子类)。
final方法:当一个方法被声明为final时,不允许任何子类重写这个方法,但子类仍然可以使用这个方法。需要主要的是,final不能修饰类的成员变量。
final类:当一个类被声明为final时,此类不能被继承,所有方法都不能被重写。需要注意的是,一个类既不能被声明为abstract,又被声明为final

  1. <?php
  2. class Test {
  3. final public function index() {
  4. echo 'I'm Test::index';
  5. }
  6. }
  7. class Home extends Test {
  8. public function index(){
  9. echo 'I'm Home::test1';
  10. }
  11. }
  12. $home = new Home();
  13. $home->index();

以上代码运行会报Fatal error: Cannot override final method Test::index() in ...,如果你的编辑器支持语法检测,在编辑的时候也会报错的。

  1. <?php
  2. final class Test {
  3. }
  4. class Home extends Test {
  5. }
  6. $home = new Home();
  7. $home->index();

以上代码运行也会报错Fatal erro']r: Cannot override final method Test::index() in ...;

简单来说,final 定义的东西是不可修改的,一般防止父类的方法被重写而使用。

2. finally的介绍

在php5.5中新增了finally模块,它只能用在try/catch语句中,作为异常处理的一部分,附带着一个语句块,表示这段语句最终一定被执行,经常被用在需要释放资源的情况下。

  1. try {
  2. } catch (Exception $e){
  3. // 异常处理
  4. } finally {
  5. }

finally块中代码的执行不受 try 和 catch 中 return 的影响,当碰到 return 的时候,会先执行finally中的代码,再返回 return 的值。

  1. <?php
  2. function test(){
  3. try{
  4. return 1111;
  5. } catch (Exception $e){
  6. // 异常处理
  7. } finally {
  8. echo "I'm finally\n";
  9. return 2222;
  10. }
  11. }
  12. echo test();

以上代码会返回

  1. I'm finally
  2. 2222