PHP - final 关键字


PHP  “final” 关键字用于类的定义、类的方法以及类常量属性的定义。

具有 “final” 关键字的类

让我们看看如何使用 “final” 关键字创建一个类 −


final class myclass {
   /* 类成员 */   
}

类定义中的 “final” 关键字可防止扩展此类。换句话说,您不能将 final 类用作父类。如果尝试,PHP 解析器会引发错误


<?php
   final class myclass {
   
      /* 类代码 */
   }
   class newclass extends myclass {
   
      /* 类代码 */ 
   }
?>

当您运行此代码时,它将显示一个错误 -

PHP Fatal error:  Class newclass may not inherit from final class (myclass)

具有 “final” 关键字的方法

以下是使用 “final” 关键字创建方法的方法 -


class myclass {
   final function myfunction() {
   
      /* 函数代码 */
   }
}

在方法定义前面加上 final 关键字可以防止它在子类中被覆盖。具有 final 方法的类可以扩展,但子类不能覆盖它。

示例

请看下面的例子 -


<?php
   class myclass {
      final public function hello() {
         echo "Hello World!";
      }
   }
   class newclass extends myclass {
      public function hello() {
         echo "Hello PHP!";
      }
   }
?>

当您运行此代码时,它将显示一个错误 -

PHP Fatal error:  Cannot override final method myclass::hello() in hello.php

带有 “final” 关键字的常量

从 PHP 8.1.0 开始,你也可以在类中使用 final 关键字声明一个常量。


final public const NAME = "My Class";

如果尝试在子类中覆盖父类中的最终常量,则会遇到错误。


<?php
   class myclass {
      final public const NAME = "My Class";
      final public function hello() {
         echo "Hello World!";
      }
   }

   class newclass extends myclass {
      public const NAME = "New Class";
   }
?>

当您运行此代码时,它将显示一个错误 -

Fatal error: newclass::NAME cannot override final constant myclass::NAME

示例

以下 PHP 脚本包含一个父类 ellipse,其中 PI 常量和 area() 方法都声明为 final。它们由 circle 类继承。area() 函数计算圆的面积。


<?php
   class ellipse {
      final public const PI=22/7;
      private float $a, $b;
      public function __construct($x, $y) {
         $this->a = $x;
         $this->b = $y;
      }
      final public function area() : float {
         return self::PI*$this->a*$this->b;
      }
   }
   class circle extends ellipse {
      public function __construct(float $x) {
         parent::__construct($x, $x);
      }
   }
   $c1 = new circle(5);
   echo "面积: " . $c1->area() . PHP_EOL;
?>

它将产生以下输出 -

面积: 78.571428571429

注意:类的实例变量或属性不能声明为 final