PHP 클래스와 객체 (Classes and Objects)

PHP 클래스와 객체 (Classes and Objects)

데이터를 프로퍼티로, 그 데이터를 다루는 동작을 메서드로 묶는 객체 지향 작성법을 PHP도 처음부터 지원해요. class로 설계도를 그리고, new로 그 설계도를 바탕으로 **객체(인스턴스)**를 만들어요. 객체는 PHP에서 배열 다음으로 자주 마주치는 복합 타입이라 기본기를 단단히 잡아두는 게 좋아요.

출처: PHP 매뉴얼 - Classes and Objects

본문

클래스와 객체 만들기

클래스 안의 변수를 프로퍼티, 함수를 메서드라고 불러요. 프로퍼티는 $this->이름으로 접근하고, 메서드도 같은 방식으로 호출해요.

class User {
    public string $name;

    public function greet(): string {
        return "Hi, {$this->name}";
    }
}

$user = new User();
$user->name = "Alice";
echo $user->greet();   // Hi, Alice

접근 제어 (Visibility)

프로퍼티와 메서드 앞에 접근 범위를 표시해요. public은 어디서나, protected는 클래스 안과 자식 클래스에서, private은 그 클래스 안에서만 접근 가능해요.

class Account {
    private int $balance = 0;

    public function deposit(int $n): void {
        $this->balance += $n;
    }
}

private 프로퍼티는 외부에서 직접 접근할 수 없으니, 그 값을 바꾸는 공개 메서드(위의 deposit 같은)를 통해 다뤄요.

생성자와 소멸자

객체를 만들 때 자동으로 실행되는 생성자__construct()라는 마법 메서드로 정의해요. 생성자에서 프로퍼티 초기화를 하면 new 한 번으로 필요한 상태를 갖춘 객체가 생겨요. 반대로 객체가 파괴될 때 호출되는 소멸자는 __destruct()로 정의해요.

class Point {
    public function __construct(
        public int $x = 0,
        public int $y = 0,
    ) {}
}

PHP 8부터는 생성자에서 프로퍼티 선언까지 한 번에 하는 프로모션(property promotion) 문법을 쓸 수 있어요. 이렇게 하면 중복된 선언을 줄일 수 있죠.

상속

extends 키워드로 부모 클래스의 프로퍼티와 메서드를 물려받는 상속을 해요. 자식 클래스에서 똑같은 이름의 메서드를 다시 정의해 동작을 바꾸는 오버라이딩도 가능해요. 오버라이딩한 메서드에서 부모 구현을 이어 쓰려면 parent::method()로 호출해요.

class Admin extends User {
    public function greet(): string {
        return parent::greet() . " (admin)";
    }
}

마법 메서드

__로 시작하는 특별한 메서드들을 마법 메서드라고 불러요. __construct(), __destruct() 외에도 객체를 문자열로 바꾸는 __toString() 같은 것들이 있어서, 객체가 특정 상황에서 어떻게 행동할지 정의할 수 있어요.

객체를 배열로 변환하면 public 프로퍼티만 남고, private 프로퍼티는 클래스 이름이 붙은 특이한 키(예: \0Class\0prop)로 들어가요. 그래서 객체를 배열처럼 다룰 때는 이 규칙을 알고 있어야 해요.