Php 简明教程

PHP - The "Final" Keyword

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

A Class with "final" Keyword

我们来看一下如何使用 “final” 关键字创建类 -

final class myclass {
   /*class members*/
}

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

<?php
   final class myclass {

      /* class body */
   }
   class newclass extends myclass {

      /* class body */
   }
?>

当您运行此代码时,它将显示 error -

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

Method with "final" Keyword

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

class myclass {
   final function myfunction() {

      /* function body */
   }
}

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

Example

请看以下示例:

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

当您运行此代码时,它将显示 error -

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

Constant with "final" Keyword

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

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";
   }
?>

当您运行此代码时,它将显示 error -

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

Example

以下 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;
?>

它将生成以下 output

Area: 78.571428571429

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