PHP Final关键字

2023-12-07 151

在PHP中,final 关键字用于声明一个类、方法或属性为不可变(不可继承)。使用 final 关键字可以提高代码的可读性和安全性,因为它限制了类的继承和方法的覆盖。

1、当用 final 修饰一个类时,该类不能被继承,子类无法继承父类的方法和属性;

2、当用 final 修饰一个方法时,该方法不能被子类覆盖(重写)。如果子类尝试覆盖这个方法,PHP会抛出一个致命错误。

3、当用 final 修饰一个属性时,该属性的值只能在构造函数中进行初始化,并且之后不能再被修改。这相当于将属性设置为常量。

一、Final方法示例

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?<a href="https://www.zzbaike.com/tag/php" title="查看所有文章关于 php" target="_blank">php</a>
class BaseClass {
public function test() {
echo "BaseClass::test() called\n";
}
final public function moreTesting() {
echo "BaseClass::moreTesting() called\n";
}
}
class ChildClass extends BaseClass {
public function moreTesting() {
echo "ChildClass::moreTesting() called\n";
}
}
// 产生 Fatal error: Cannot override final method BaseClass::moreTesting()
?>
<?<a href="https://www.zzbaike.com/tag/php" title="查看所有文章关于 php" target="_blank">php</a> class BaseClass { public function test() { echo "BaseClass::test() called\n"; } final public function moreTesting() { echo "BaseClass::moreTesting() called\n"; } } class ChildClass extends BaseClass { public function moreTesting() { echo "ChildClass::moreTesting() called\n"; } } // 产生 Fatal error: Cannot override final method BaseClass::moreTesting() ?>
<?php
class BaseClass {
   public function test() {
       echo "BaseClass::test() called\n";
   }
   
   final public function moreTesting() {
       echo "BaseClass::moreTesting() called\n";
   }
}

class ChildClass extends BaseClass {
   public function moreTesting() {
       echo "ChildClass::moreTesting() called\n";
   }
}
// 产生 Fatal error: Cannot override final method BaseClass::moreTesting()
?>

二、Final类示例

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?php
final class BaseClass {
public function test() {
echo "BaseClass::test() called\n";
}
// 由于类已经是 final,所以 final 关键字是多余的
final public function moreTesting() {
echo "BaseClass::moreTesting() called\n";
}
}
class ChildClass extends BaseClass {
}
// 产生 Fatal error: Class ChildClass may not inherit from final class (BaseClass)
?>
<?php final class BaseClass { public function test() { echo "BaseClass::test() called\n"; } // 由于类已经是 final,所以 final 关键字是多余的 final public function moreTesting() { echo "BaseClass::moreTesting() called\n"; } } class ChildClass extends BaseClass { } // 产生 Fatal error: Class ChildClass may not inherit from final class (BaseClass) ?>
<?php
final class BaseClass {
   public function test() {
       echo "BaseClass::test() called\n";
   }
   
   // 由于类已经是 final,所以 final 关键字是多余的
   final public function moreTesting() {
       echo "BaseClass::moreTesting() called\n";
   }
}

class ChildClass extends BaseClass {
}
// 产生 Fatal error: Class ChildClass may not inherit from final class (BaseClass)
?>

三、PHP8.1.0

下面列出了PHP 8.1.0 起可用的 final 常量示例:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?php
class Foo
{
final public const X = "foo";
}
class Bar extends Foo
{
public const X = "bar";
}
// Fatal error: Bar::X cannot override final constant Foo::X
?>
<?php class Foo { final public const X = "foo"; } class Bar extends Foo { public const X = "bar"; } // Fatal error: Bar::X cannot override final constant Foo::X ?>
<?php
class Foo
{
    final public const X = "foo";
}

class Bar extends Foo
{
    public const X = "bar";
}

// Fatal error: Bar::X cannot override final constant Foo::X
?>

注意:属性和常量不能被定义为 final,只有类、方法、常量(PHP 8.1.0 起)才能被定义为 final。 从 PHP 8.0.0 起,除了构造函数之外,私有方法也不能声明为 final 。

  • 广告合作

  • QQ群号:4114653

温馨提示:
1、本网站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。邮箱:2942802716#qq.com(#改为@)。 2、本站原创内容未经允许不得转裁,转载请注明出处“站长百科”和原文地址。
PHP Final关键字
上一篇: PHP魔术方法
PHP Final关键字
下一篇: PHP对象复制