PHP final关键字怎么用?
在 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关键字可以防止它在子类中被覆盖。包含finalmethod 的 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。
