파생 클래스가 인스턴스화될 때 추상 클래스 생성자가 암시적으로 호출되지 않습니까?
예를 들어 다음과 같습니다.
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
'bestsource' 카테고리의 다른 글
XMLHttpRequest에서 XXX No 'Access-Control-Allow-Origin' 헤더를 로드할 수 없습니다. (0) | 2023.09.21 |
---|---|
축, 눈금 및 레이블의 색상을 변경하는 방법 (0) | 2023.09.21 |
MariaDB 도커가 로컬 도메인을 호스트로 사용하여 연결할 수 없음 (0) | 2023.09.21 |
jQuery를 사용하여 여러 개의 선택 상자 값을 얻는 방법은? (0) | 2023.09.21 |
C를 배우기에 가장 좋은 장소는 어디입니까? (0) | 2023.09.21 |