2010-02-23 4 views
52

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

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

답변

94

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

parent::__construct(); 

필요한 경우는, 매개 변수 전달 : 아이 클래스의 생성자에서

, 당신은 부모 클래스의 생성자를 호출해야합니다.

일반적으로 특정 코드 앞에 자식 클래스 생성자가 시작될 때이를 수행합니다. 참조를 위해, 당신은 PHP 매뉴얼의이 페이지에서 좀 걸릴 수 있습니다,

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


을 그리고 : : 즉, 귀하의 경우, 당신이 가진 것 Constructors and Destructors -이 상태 (인용) :

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

+1

명시 적으로 언급하지 않았지만 자식 클래스에 생성자가 없으면 부모 생성자가 호출됩니다. 그게 사실이야? – andrew

+9

예 : 하위 클래스가 생성자를 정의하지 않으면 상위 클래스가 생성자를 정의하지 않으므로 ;;; 설명서 인용 : 부모 생성자는 암시 적으로 호출되지 않습니다 ** 자식 클래스가 생성자를 정의하는 경우 **. –

+0

@PascalMARTIN 감사합니다. 확인을 위해 주변을 둘러 보았습니다. 약간의 검색을했다. –

5

글쎄, 난 그냥 docs이 발견 :

참고 : 자식 클래스 생성자를 정의하는 경우 부모의 생성자는 암시라고 을하지 않습니다. 부모 생성자 을 실행하려면 자식 생성자 내에 parent :: __ construct()를 호출해야합니다. 당신은 C#을 같은 동작을해야하는 경우

+1

추상 클래스에서 생성자를 작성하는 주된 이유는이 클래스에서 상속 한 모든 클래스가 지정된 코드를 실행하도록 강제하는 것입니다. PHP가 생성자를 선택적으로 실행하게하는 것은 정말 수치스러운 일입니다. –

+2

@RyanWilliams 클래스에서 추가 초기화를 수행하기 전에 상위 생성자를 호출해야하는 경우가 있으며 추가 초기화 후에 부모가 호출되는 경우가 있습니다. 따라서 PHP는 많은 유스 케이스를 지원합니다. – Nux

1

, 즉 항상 자식 생성자 전에 실행됩니다 부모 생성자는, 당신은 당신의 아이 클래스에 대한 가짜 생성자 클래스를 작성하고 추상 상위 클래스에서 추상 함수로 선언 할 수 .

예.

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 */ 
관련 문제