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.
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)
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ó.
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
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
Đ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.