2017-10-20 20 views
3

나는 꽤 많은 형식의 공장을 사용하는 독점 프로젝트에서 작업합니다. 다행히 클래스의 이름을 인스턴스화하지 않는 것이 대부분이지만 인스턴스화하는 데 new self() 또는 new static()이 사용되는지 여부는 개발자에 따라 다릅니다.새로운 자체 또는 새 정적을 사용해야합니까?

나는 차이점을 알고 있지만 늦은 정적 바인딩이 기술적으로 필요하지 않을 때 "올바른"방법이 무엇인지에 대한 합의가 있다면 궁금합니다. 예를 들어, new static()은 거의 확실하게 서브 클래 싱되지 않는 서비스 클래스에서 자주 발견됩니다. 분명히 추상 클래스에서는 중요하지만, 내 선호는 서브 클래스를 기대하지 않는 곳에 new self()을 사용하는 것입니다.

는 내가 호기심이 약 해요 : 기술적 인 차이를 해결

질문

  • 인가 거기 후기 정적 바인딩을 사용하면 성능이 저하됩니까?
  • 하나의 관행을 채택 할 때 코드 유지 관리에 영향이 있습니까? 예 : new self()을 사용하여 클래스를 하위 클래스로 만들면 이러한 모든 사례를 재정의하거나 변경해야하지만 내 생성자가 변경되면 나쁜 것은 아닙니다.
  • 문서화 된 모범 사례가 있습니까? 우리는 PSR-2를 적어도 흡기 적으로 사용하지만,이 부분을 다루지는 않는다고 생각합니다. 그은을 돌려 푸 정적 방법) ((팩토리 메소드)를 만듭니다 선언하면 의미

    파생 클래스의 인스턴스가 발생합니다 새 정적을 반환 :

+0

질문 1 (실적이 좋음)에 대해 실제 수업을 1M 번이나 비슷하게 벤치마킹 해주세요. –

답변

4

첫째, 잠시의 차이를 설명 할 수 있습니다 new static이면 Foo의 Foo::Create() 또는 self::Create()을 호출하면 Foo의 인스턴스가 반환됩니다. 그러나 class Bar extends Foo이고 Bar::Create()을 호출하면 Bar 인스턴스가 반환됩니다.

따라서 Bar::Create()이 Foo의 인스턴스를 반환하도록하려면 새로운 정적이 아닌 새로운 자체를 사용해야합니다.

Create()와 같은 정적 팩터 리 메서드가 파생 클래스의 인스턴스를 반환한다는 개발자의 기대를 고려할 때 후기 바인딩 유형을 반환하는 것이 대부분의 경우 올바른 대답 일 수 있다고 주장합니다. 그러나 클래스가 final (봉인 된, 연장으로 폐쇄 된)으로 표시되어 있으면 문제가되지 않습니다. 클래스가 final이 아니라고 가정하면 (다른 클래스가 그것을 확장 할 수 있다고 가정 할 때), static이 올바른 선택 일 수 있습니다.

지금까지 성능이 향상되었습니다. 주어진 PHP가 해석되면, 나는 그것이 상당한 성능 함의를 가지고 있다고 상상할 수 없다. 이것은 실제로 더 정확한/의미 론적 인 것에 대한 토론이며, 반복해서 말하면서, 새로운 정적을 반환하는 것이 정확한 상황이라고 생각합니다. 특정 상황에서 예외적 인 새로운 자아를 반환하는 것이 대부분입니다.

이 질문은 실제로 여기와 매우 비슷합니다 (Is it possible to overuse late static binding in PHP?). 그 대답도 유용 할 것입니다.

+1

언제든지 [최종으로 클래스 선언] (https://secure.php.net/manual/en/language.oop5.final.php) 할 수 있습니다. – Mikkel

+0

당신은 정확합니다, 내 대답을 편집 중입니다. – MSC