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。

廣告