Php 简明教程
PHP - The "Final" Keyword
PHP 中的 “final” 关键字用于类定义、类中的方法,以及类常量属性的定义。
A Class with "final" Keyword
我们来看一下如何使用 “final” 关键字创建类 -
final class myclass {
/*class members*/
}
类定义中的 “final” 关键字防止此类被扩展。换句话说,您不能将 final 类用作父类。如果您尝试这样做,PHP 解析器会抛出一个错误
<?php
final class myclass {
/* class body */
}
class newclass extends myclass {
/* class body */
}
?>
当您运行此代码时,它将显示 error -
PHP Fatal error: Class newclass may not inherit from final class (myclass)
Method with "final" Keyword
下面是使用 “final” 关键字创建方法的方式 -
class myclass {
final function myfunction() {
/* function body */
}
}
用 final 关键字给方法定义加上前缀,可以防止在子类中覆盖它。具有 final 方法的类可以扩展,但子类不能覆盖它。
Constant with "final" Keyword
还可以使用 final 关键字在类中声明常量,从 PHP 8.1.0 开始。
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";
}
?>
当您运行此代码时,它将显示 error -
Fatal error: newclass::NAME cannot override final constant myclass::NAME
Example
以下 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;
?>
它将生成以下 output −
Area: 78.571428571429
请注意,类的实例变量或属性不能声明为 final。