final 키워드

final 키워드 (Final Keyword)

이 페이지에서는 메서드, 프로퍼티, 상수, 그리고 클래스 자체의 재정의를 막는 final 키워드의 사용법을 알아봐요.

출처: PHP: Final Keyword - Manual

본문

final 키워드는 정의 앞에 final을 붙여서 자식 클래스가 메서드, 프로퍼티, 상수를 오버라이드하지 못하게 막아줍니다. 클래스 자체가 final로 정의되면 그 클래스는 상속될 수 없어요.

예제 #1 final 메서드 예제

<?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";
   }
}
// Results in Fatal error: Cannot override final method BaseClass::moreTesting()
?>

예제 #2 final 클래스 예제

<?php
final class BaseClass {
   public function test() {
       echo "BaseClass::test() called\n";
   }

   // As the class is already final, the final keyword is redundant
   final public function moreTesting() {
       echo "BaseClass::moreTesting() called\n";
   }
}

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

예제 #3 PHP 8.4.0부터의 final 프로퍼티 예제

<?php
class BaseClass {
   final protected string $test;
}

class ChildClass extends BaseClass {
    public string $test;
}
// Results in Fatal error: Cannot override final property BaseClass::$test
?>

예제 #4 PHP 8.1.0부터의 final 상수 예제

<?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
?>

Note:

PHP 8.0.0부터 private 메서드는 생성자(constructor) 를 제외하고는 final로 선언할 수 없어요.

Note:

private(set)로 선언된 프로퍼티는 암시적으로 final이 됩니다.

더 알아보기