📜  PHP oops中final关键字(1)

📅  最后修改于: 2023-12-03 15:18:20.558000             🧑  作者: Mango

PHP OOP 中的 final 关键字

在 PHP 面向对象编程中,final 关键字用于标记类、方法或属性不能被继承或覆盖。本文将详细介绍 final 关键字及其在 PHP OOP 中的用法。

使用方式
标记类不能被继承
final class MyClass
{
    // 类的定义
}

使用 final 关键字来标记一个类,可以防止其他类继承它。

标记方法不能被覆盖
class MyClass
{
    final public function myMethod()
    {
        // 方法的定义
    }
}

使用 final 关键字来标记一个方法,可以防止它被任何子类覆盖。

标记属性不能被覆盖
class MyClass
{
    final protected $myProperty;
    
    public function __construct($value)
    {
        $this->myProperty = $value;
    }
}

使用 final 关键字来标记一个属性,可以防止它被任何子类覆盖。

注意事项
  • final 关键字只能在类、方法或属性的声明前使用。
  • 如果尝试继承一个被标记为 final 的类,或者覆盖一个被标记为 final 的方法或属性,PHP 将抛出一个 fatal error。
  • 在 PHP 5.4 之前,final 关键字只能用于方法或类的声明。在 PHP 5.4 及以后的版本中,final 关键字也可以用于属性的声明。
示例代码

下面是一个使用 final 关键字的示例代码:

final class ParentClass
{
    final public function myMethod()
    {
        echo "This method cannot be overridden by any child class.";
    }
    
    final protected $myProperty;
    
    public function __construct($value)
    {
        $this->myProperty = $value;
    }
}

class ChildClass extends ParentClass
{
    // 如果尝试继承 ParentClass 类,PHP 将抛出 fatal error
    // public function myMethod()
    // {
    //     echo "This method cannot be overridden by any child class.";
    // }
}

$obj = new ParentClass("Hello world!");
echo $obj->myProperty; // Outputs: Hello world!

$obj2 = new ChildClass("Hi world!"); // 抛出 fatal error

以上代码定义了一个 ParentClass 类,并标记它的 myMethod 方法和 myProperty 属性都不能被覆盖。同时,我们定义了一个 ChildClass 类并试图继承 ParentClass 类,结果 PHP 抛出了 fatal error。