PHP에서 상속 관계에 있을 때 자식 클래스에서 부모 클래스의 생성자를 호출해야 하는 상황은 크게 두 가지 경우로 나눌 수 있습니다.
첫 번째 경우: 자식 클래스가 생성자를 정의한 경우
자식 클래스에서 직접 생성자를 정의하면 부모 클래스의 생성자는 자동으로 실행되지 않습니다. 부모의 생성자를 실행하려면 반드시 자식 클래스의 생성자 내부에서 parent::__construct()를 명시적으로 호출해야 합니다.
예제 코드
<?php
class grandpa{
public function __construct(){
echo "I am in Tutorials Point"."\n";
}
}
class papa extends grandpa{
public function __construct(){
parent::__construct();
echo "I am not in Tutorials Point";
}
}
$obj = new papa();
?>
실행 결과
I am in Tutorials Point
I am not in Tutorials Point
설명
위 예제에서 papa 클래스(자식)는 grandpa 클래스(부모)를 상속받으면서 자체 생성자를 가지고 있습니다. 이때 parent::__construct()를 호출했기 때문에 부모 클래스의 생성자가 먼저 실행되고, 그다음 자식 클래스의 코드가 실행됩니다. 만약 parent::__construct() 호출이 없었다면 "I am in Tutorials Point"는 출력되지 않았을 것입니다.
두 번째 경우: 자식 클래스가 생성자를 정의하지 않은 경우
자식 클래스에 생성자가 정의되어 있지 않다면, 일반적인 메서드와 마찬가지로 부모 클래스의 생성자가 상속됩니다. 단, 부모의 생성자가 private으로 선언된 경우에는 상속되지 않습니다.
예제 코드
<?php
class grandpa{
public function __construct(){
echo "I am in Tutorials point";
}
}
class papa extends grandpa{
}
$obj = new papa();
?>
실행 결과
I am in Tutorials point
설명
이번에는 자식 클래스인 papa에 어떠한 생성자도 선언하지 않았습니다. 따라서 객체를 생성할 때 부모 클래스 grandpa의 생성자가 암묵적으로(implicitly) 호출되어 결과가 출력됩니다.
정리
핵심을 요약하면 다음과 같습니다.
- 자식 클래스에 생성자가 있는 경우: 부모 생성자가 자동으로 호출되지 않으므로 반드시
parent::__construct()를 직접 호출해야 합니다. - 자식 클래스에 생성자가 없는 경우: 부모의 생성자(private 제외)가 그대로 상속되어 자동으로 실행됩니다.