PHP final关键字怎么用?

文章导读
Previous Quiz Next 在 PHP 中,final 关键字可以防止 class 和 function 被修改或覆盖。它有助于保护代码的重要部分,确保在进行修改时不会意外破坏它们。
📋 目录
  1. final 关键字的作用是什么?
  2. 与 Class 一起使用 final
  3. 与 Method 一起使用 final
  4. 与 Constant 一起使用 final
  5. 实际示例:ellipse 和 circle Class
A A

PHP - final 关键字



Previous
Quiz
Next

在 PHP 中,final 关键字可以防止 class 和 function 被修改或覆盖。它有助于保护代码的重要部分,确保在进行修改时不会意外破坏它们。

final 关键字用于 class 的定义、class 中的 method,以及 class 的 constant property 的定义。

final 关键字的作用是什么?

final 关键字有两种用法 —

  • 用于 Class: 防止该 class 被扩展(继承)。

  • 用于 Method: 防止它们在子类中被覆盖。

在本章中,我们将介绍以下主题 —

  • 与 Class 一起使用 final

  • 与 Method 一起使用 final

  • 与 Constant 一起使用 final

  • 实际示例:ellipse 和 circle Class

与 Class 一起使用 final

让我们看看如何使用 final 关键字创建 class —

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

示例:Class 继承错误

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

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

输出

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

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

与 Method 一起使用 final

以下是如何使用 final 关键字创建 method —

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

在 method 定义前添加 final 关键字可以防止它在子类中被覆盖。包含 final method 的 class 可以被扩展,但子类不能覆盖它。

示例:Method 覆盖错误

看下面的示例 —

<?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

与 Constant 一起使用 final

从 PHP 8.1.0 开始,你也可以使用 final 关键字在 class 中声明 constant。

final public const NAME = "My Class";

示例:Final constant 继承错误

如果你尝试在子类中覆盖父类中的 final constant,将遇到错误。

<?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

实际示例:ellipse 和 circle Class

以下 PHP 脚本包含一个父类 ellipse,其中 PI constant 和 area() method 都被声明为 final。它们被 circle class 继承。area() function 计算圆的面积。

<?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

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