bestsource

파생 클래스가 인스턴스화될 때 추상 클래스 생성자가 암시적으로 호출되지 않습니까?

bestsource 2023. 9. 21. 20:40
반응형

파생 클래스가 인스턴스화될 때 추상 클래스 생성자가 암시적으로 호출되지 않습니까?

예를 들어 다음과 같습니다.

abstract class Base {
    function __construct() {
        echo 'Base __construct<br/>';
    }
}

class Child extends Base {
    function __construct() {
        echo 'Child __construct<br/>';
    }
}

$c = new Child();   

C# 배경에서 오는 출력은 다음과 같습니다.

밑면 __구성
자녀 __구성

그러나 실제 출력은 단지

자녀 __구성

아니요, 자식 클래스가 생성자를 정의하는 경우 부모 클래스의 생성자가 호출되지 않습니다.

자식 클래스의 생성자에서 부모 클래스의 생성자를 호출해야 합니다.

parent::__construct();

필요한 경우 매개변수 전달

일반적으로 특정 코드 이전에 하위 클래스의 생성자를 시작할 때 수행합니다. 즉, 사용자의 경우 다음을 수행할 수 있습니다.

class Child extends Base {
    function __construct() {
        parent::__construct();
        echo 'Child __construct<br/>';
    }
}


그리고 참고로 PHP 매뉴얼의 이 페이지인 Constructors and Destructor -- (인용)을 보면 다음과 같습니다.

참고: 자식 클래스가 생성자를 정의하는 경우 부모 생성자가 암시적으로 호출되지 않습니다.
부모 생성자를 실행하려면 다음으로 호출합니다.parent::__construct()차일드 컨스트럭터가 필요합니다.

방금 서류에서 이걸 발견했어요

참고: 자식 클래스가 생성자를 정의하는 경우 부모 생성자가 암시적으로 호출되지 않습니다.부모 생성자를 실행하려면 부모 생성자 호출::__자 생성자 내의 construct()이 필요합니다.

C#과 동일한 동작이 필요한 경우, 즉 자식 생성자가 항상 실행되기 전에 부모 생성자가 실행되는 경우 자식 클래스에 대한 가짜 생성자 클래스를 생성하고 추상 부모 클래스에서 추상 함수로 선언할 수 있습니다.

예.

abstract class Test{
  abstract public function __childconstruct();
  public function __construct(){
    echo "SOME CODE".PHP_EOL;
    $this->__childconstruct();
  }
}

class TestExtended extends Test{
  public function __childconstruct(){
    echo "SOME OTHER CODE FROM EXTENDED CLASS".PHP_EOL;
  }
}

$a = new TestExtended();

/* SOME CODE
   SOME OTHER CODE FROM EXTENDED CLASS */

언급URL : https://stackoverflow.com/questions/2321009/are-abstract-class-constructors-not-implicitly-called-when-a-derived-class-is-in

반응형