Computer >> 컴퓨터 >  >> 프로그래밍 >> PHP

PHP 생성자와 소멸자 완벽 정리: __construct와 __destruct 사용법

PHP 생성자(Constructor)란?

객체 지향 프로그래밍(OOP)에서 생성자(constructor)는 클래스 내부에 정의된 특별한 메서드로, 객체가 생성되는 순간 자동으로 호출됩니다. 생성자의 주된 목적은 새로 만들어진 객체의 속성을 초기화하는 것입니다.

PHP에서는 __construct라는 이름의 메서드가 생성자 역할을 수행합니다. 이 방식은 PHP 5부터 도입되었으며, 그 이전 버전에서는 클래스와 같은 이름을 가진 메서드가 생성자로 사용되었습니다.

생성자 문법

__construct ([ mixed $args = "" [, $... ]] ) : void

기본 생성자 예제

다음 예제는 객체가 생성되는 순간 생성자가 자동으로 실행됨을 보여줍니다.

<?php
class myclass{
    function __construct(){
        echo "객체가 초기화되었습니다";
    }
}
$obj=new myclass();
?>

실행 결과:

객체가 초기화되었습니다

인자를 받는 생성자

생성자에 인자를 전달하면 객체 생성 시점에 클래스 속성(property)의 값을 함께 초기화할 수 있습니다.

<?php
class rectangle{
    var $height;
    var $width;
    function __construct($arg1, $arg2){
        $this->height=$arg1;
        $this->width=$arg2;
    }
    function show(){
        echo "높이=$this->height 너비=$this->width";
    }
}
$obj=new rectangle(10,20);
$obj->show();
?>

참고로 위 예제의 var 키워드는 예전 방식이며, 현대 PHP에서는 public, protected, private 같은 접근 제어자를 사용하는 것이 권장됩니다.

실행 결과:

높이=10 너비=20

상속 관계에서의 생성자

부모 클래스에 생성자가 정의되어 있다면, 자식 클래스의 생성자 안에서 parent::__construct()를 호출하여 실행할 수 있습니다. 반면 자식 클래스가 생성자를 정의하지 않았다면 부모 클래스의 생성자를 그대로 물려받아 사용합니다.

<?php
class a{
    function __construct(){
        echo "부모 클래스 a의 생성자입니다\n";
    }
}
class b extends a{
    function __construct(){
        parent::__construct();
        echo "자식 클래스 b의 생성자입니다\n";
    }
}
class c extends a {
    //
}
$a=new a();
$b=new b();
$c=new c();
?>

실행 결과:

부모 클래스 a의 생성자입니다
부모 클래스 a의 생성자입니다
자식 클래스 b의 생성자입니다
부모 클래스 a의 생성자입니다

클래스 b는 자체 생성자 안에서 parent::__construct()를 명시적으로 호출하기 때문에 부모의 메시지가 먼저 출력됩니다. 반면 생성자를 정의하지 않은 클래스 c는 객체 생성 시 부모의 생성자가 그대로 실행됩니다.

소멸자(Destructor)

소멸자(destructor)는 가비지 컬렉터가 특정 객체에 대한 참조가 더 이상 존재하지 않는다고 판단하는 순간 자동으로 호출되는 메서드입니다. PHP에서는 __destruct라는 이름을 사용하며, 스크립트 종료(shutdown) 과정에서도 객체들이 소멸되면서 호출됩니다. 소멸자는 인자를 받지 않으며, 별도의 값을 반환하지도 않습니다.

<?php
class myclass{
    function __construct(){
        echo "객체가 초기화되었습니다\n";
    }
    function __destruct(){
        echo "객체가 소멸되었습니다\n";
    }
}
$obj=new myclass();
?>

실행 결과:

객체가 초기화되었습니다
객체가 소멸되었습니다