programing tip

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

itbloger 2020. 12. 1. 07:44
반응형

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


이 예를 보자 :

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

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

$c = new Child();   

C # 배경에서 왔으므로 출력이

기본 __construct
하위 __construct

그러나 실제 출력은

하위 __construct


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

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

parent::__construct();

필요한 경우 매개 변수를 전달합니다.

일반적으로 특정 코드 이전에 자식 클래스의 생성자 시작 부분에서이 작업을 수행합니다. 즉, 귀하의 경우에는 다음이 필요합니다.

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


그리고, 참조를 위해, 당신은 PHP 매뉴얼의이 페이지를 살펴 수행 할 수 있습니다 생성자와 소멸자를 - 그것은 상태 (인용) :

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


글쎄, 방금 문서 에서 찾았습니다 .

참고 : 자식 클래스가 생성자를 정의하는 경우 부모 생성자는 암시 적으로 호출되지 않습니다. 부모 생성자를 실행하려면 자식 생성자 내에서 parent :: __ 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

반응형