PHP - The "Final" Keyword

Từ khóa "final" trong PHP được sử dụng trong định nghĩa của một lớp, một phương thức bên trong lớp, cũng như với định nghĩa của một thuộc tính hằng số của một lớp.

A Class with "final" Keyword

Hãy xem cách tạo một lớp với từ khóa "final" −

final class myclass {
   /*class members*/   
}

Từ khóa "final" trong định nghĩa lớp ngăn chặn lớp đó không bị mở rộng. Nói cách khác, bạn không thể sử dụng một lớp final làm lớp cha. Nếu bạn cố gắng, trình phân tích cú pháp PHP sẽ ném ra một lỗi.

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

Khi bạn chạy đoạn mã này, nó sẽ hiển thị một error

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

Method with "final" Keyword

Dưới đây là cách bạn có thể tạo một phương thức với từ khóa "final" −

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

Việc thêm tiền tố cho định nghĩa phương thức với từ khóa final ngăn chặn nó bị ghi đè trong một lớp con. Một lớp có phương thức final có thể được mở rộng, nhưng lớp con không thể ghi đè nó.

Example

Hãy xem xét ví dụ sau −

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

Khi bạn chạy đoạn mã này, nó sẽ hiển thị một error

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

Constant with "final" Keyword

Bạn cũng có thể khai báo một hằng số trong một lớp với từ khóa final , bắt đầu từ PHP 8.1.0 trở đi.

final public const NAME = "My Class";

Nếu bạn cố gắng ghi đè một hằng số cuối từ lớp cha trong lớp con, một lỗi sẽ xảy ra.

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

Khi bạn chạy đoạn mã này, nó sẽ hiển thị một error

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

Example

Đoạn mã PHP sau đây chứa một lớp cha ellipse với hằng số PI và phương thức area() được khai báo là final. Chúng được kế thừa bởi lớp circle. Hàm area() tính diện tích của hình tròn.

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

Nó sẽ tạo ra output

Area: 78.571428571429

Lưu ý rằng các biến thể hiện hoặc thuộc tính của một lớp không thể được khai báo là final.