programing

PHP에서 Final을 언제 사용할 것인가요?

javajsp 2023. 10. 26. 20:45

PHP에서 Final을 언제 사용할 것인가요?

파이널 클래스의 정의가 무엇인지는 알고 있지만, 파이널이 정말로 필요한 시기와 방법을 알고 싶습니다.

<?php
final class Foo extends Bar
{
   public function()
   {
     echo 'John Doe';
   }
}

제가 제대로 이해하면 final은 Foo를 확장할 수 있습니다.

누가 '파이널'을 언제, 왜 사용해야 하는지 설명해 줄 수 있습니까?다시 말해, 수업을 연장해서는 안 되는 이유가 있습니까?

예를 들어 클래스 'Bar'와 클래스 'Foo'에 일부 기능이 없는 경우 'Bar'를 확장하는 클래스를 생성하는 것이 좋습니다.

언제 수업이 마무리되는지에 대한 좋은 기사가 있습니다.여기서 몇 가지 인용구:

TL로 ;DR: 항상 수업을 진행합니다.final, 그들이 인터페이스를 구현하고, 다른 공개 방법이 정의되지 않은 경우.

사용해야 하는 이유final?

  1. 파멸의 대규모 상속 체인 방지
  2. 고무적인 구도
  3. 개발자가 사용자 공개 API에 대해 생각하도록 강제합니다.
  4. 개발자가 개체의 공용 API를 축소하도록 강제합니다.
  5. A final클래스는 항상 확장 가능하게 만들 수 있습니다.
  6. extends깨기 캡슐화
  7. 그런 유연성은 필요 없습니다.
  8. 코드를 자유롭게 변경할 수 있습니다.

피해야 할 시기final:

최종 수업은 다음과 같은 가정 하에서만 효과적으로 진행됩니다.

  1. 최종 수업에서 구현하는 추상화(인터페이스)가 있습니다.
  2. 최종 클래스의 모든 공개 API는 해당 인터페이스의 일부입니다.

이 두 가지 전제 조건 중 하나가 없으면 코드가 추상화에 진정으로 의존하지 않으므로 클래스를 확장할 수 있는 시점에 도달할 가능성이 높습니다.

추신. 훌륭한 독서를 해주신 @occramius님께 감사드립니다!

일반적으로 사용할 경우, 수업을 하지 않는 것을 추천합니다.final할 수 이 합리적일 수 복잡한 API/프레임워크를 설계하고 프레임워크 사용자가 제어하기를 원하는 기능의 일부만 재정의할 수 있도록 하려면 이러한 가능성을 제한하고 특정 기본 클래스를 만드는 것이 합리적일 수 있습니다.final.

예를 들어, 만약 당신이Integer선생님, 그게 말이 될지도 몰라요.final당신의 프레임워크의 사용자들을 우선시하기 위해, 예를 들어,add(...)당신의 반에서 메소드.

그 이유는 다음과 같습니다.

  1. 클래스를 final로 선언하면 해당 클래스가 하위 클래스로 분류되지 않습니다. 마침표입니다. 줄의 끝입니다.

  2. 클래스의 모든 메서드를 final로 선언하면 상위 클래스의 메서드에 액세스할 수 있지만 재정의할 수 없는 하위 클래스를 만들 수 있습니다.하위 클래스는 고유한 메서드를 추가로 정의할 수 있습니다.

  3. 마지막 키워드는 재정의 기능만 제어하며 개인 가시성 수정자와 혼동해서는 안 됩니다.개인 메서드는 다른 클래스에서 액세스할 수 없으며, 마지막 클래스는 액세스할 수 있습니다.

—— David PowersPHP Object-Oriented Solutions라는 책의 68페이지에서 인용하였습니다.

예를 들어,

final childClassname extends ParentsClassname {
    // class definition omitted
}

여기에는 모든 메서드 및 속성을 포함한 전체 클래스가 포함됩니다.childClassname에서 자식 클래스를 만들려는 시도는 치명적인 오류로 이어집니다.그러나 클래스를 서브클래식하도록 허용해야 하지만 특정 메서드를 무시하지 못하도록 해야 하는 경우 마지막 키워드가 메서드 정의 앞에 표시됩니다.

class childClassname extends parentClassname { 
    protected $numPages;

    public function __construct($autor, $pages) {
        $this->_autor = $autor;
        $this->numPages = $pages;
    }

    final public function PageCount() { 
        return $this->numPages; 
    }
}

이 예에서, 그들 중 아무도 다음을 무시할 수 없을 것입니다.PageCount()방법.

A finalclass는 확장할 수 없는 class입니다. http://php.net/manual/en/language.oop5.final.php

클래스에 특별히 무시하지 않을 메서드가 포함된 경우 이 메서드를 사용합니다.이렇게 하면 응용프로그램이 어떤 식으로든 손상되기 때문일 수 있습니다.

나의 2센트:

할 때final:

  • 절대!!

왜요?

  • 유닛 테스트를 할 때 테스트 더블을 사용할 수 있는 능력이 깨집니다.
  • 다운스트림 코드의 기능 차이로 인해 코드 중복이 증가할 수 있습니다.
  • 사용하는 이유는 모든 교육 문제가 근본적인 단축키로 해결되기 때문입니다.

사용해야 하는 나쁜 이유:

  • 대규모 상속 연쇄 파멸 방지(훈련 문제)
  • 구성 장려(교육 이슈)
  • 개발자로 하여금 사용자 공개 API(교육 문제)에 대해 생각하게 합니다.
  • 개발자에게 객체의 공개 API 축소를 강제합니다(교육 문제? 코드 리뷰?)
  • 최종 수업은 항상 확장 가능하게 할 수 있습니다(관련성?).
  • extension은 캡슐화를 끊습니다(뭐라고요? 잘못된 캡슐화는 캡슐화를 끊습니다. 상속이 아닙니다.). 상속이 본질적으로 나쁜 것은 아닙니다.)
  • 그러한 유연성은 필요하지 않습니다. (단견 개발의 이면에 있는 전형적인 사고 방식. 특징 벽에 부딪힐 준비 + 훈련 문제)
  • 코드를 변경하실 수 있습니다(관련성?).

언급URL : https://stackoverflow.com/questions/4248021/when-to-use-final-in-php