반응형
파생 클래스가 인스턴스화 될 때 추상 클래스 생성자가 암시 적으로 호출되지 않습니까?
이 예를 보자 :
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 */
반응형
'programing tip' 카테고리의 다른 글
emacs에서 탭 문자 찾기 (0) | 2020.12.01 |
---|---|
WinForm의 Dispose 메서드를 어떻게 확장합니까? (0) | 2020.12.01 |
Rails에서 URL 헬퍼에 대한 기본 호스트를 어떻게 설정합니까? (0) | 2020.12.01 |
Paperclip 및 RMagick에서 기존 이미지를 새로운 스타일로 크기 조정 (0) | 2020.12.01 |
git describe가 "치명적 : 이름을 찾을 수 없음, 아무것도 설명 할 수 없음"과 함께 실패합니다. (0) | 2020.12.01 |