PHP - “final” 关键字



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

使用“final”关键字的类

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

final class myclass {
   /*class members*/   
}

在类定义中使用“final”关键字会阻止此类被扩展。换句话说,您不能使用 final 类作为父类。如果您尝试这样做,PHP 解析器会抛出错误。

<?php
   final class myclass {
   
      /* class body */
   }
   class newclass extends myclass {
   
      /* class body */ 
   }
?>

运行此代码时,将显示错误

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

使用“final”关键字的方法

以下是如何使用“final”关键字创建方法:

class myclass {
   final function myfunction() {
   
      /* function body */
   }
}

在方法定义前加上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";

如果您尝试在子类中重写父类中的 final 常量,则会遇到错误。

<?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 "Area: " . $c1->area() . PHP_EOL;
?>

它将产生以下输出

Area: 78.571428571429

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

广告