PHP “final” 关键字用于类的定义、类的方法以及类常量属性的定义。
具有 “final” 关键字的类
让我们看看如何使用 “final” 关键字创建一个类 −
final class myclass {
/* 类成员 */
}
类定义中的 “final” 关键字可防止扩展此类。换句话说,您不能将 final 类用作父类。如果尝试,PHP 解析器会引发错误
<?php
final class myclass {
/* 类代码 */
}
class newclass extends myclass {
/* 类代码 */
}
?>
当您运行此代码时,它将显示一个错误 -
PHP Fatal error: Class newclass may not inherit from final class (myclass)
具有 “final” 关键字的方法
以下是使用 “final” 关键字创建方法的方法 -
class myclass {
final function myfunction() {
/* 函数代码 */
}
}
在方法定义前面加上 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";
如果尝试在子类中覆盖父类中的最终常量,则会遇到错误。
<?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 "面积: " . $c1->area() . PHP_EOL;
?>
它将产生以下输出 -
面积: 78.571428571429
注意:类的实例变量或属性不能声明为 final。