PHP 클래스와 객체 (Classes and Objects)
PHP 클래스와 객체 (Classes and Objects)
데이터를 프로퍼티로, 그 데이터를 다루는 동작을 메서드로 묶는 객체 지향 작성법을 PHP도 처음부터 지원해요. class로 설계도를 그리고, new로 그 설계도를 바탕으로 **객체(인스턴스)**를 만들어요. 객체는 PHP에서 배열 다음으로 자주 마주치는 복합 타입이라 기본기를 단단히 잡아두는 게 좋아요.
본문
클래스와 객체 만들기
클래스 안의 변수를 프로퍼티, 함수를 메서드라고 불러요. 프로퍼티는 $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)로 들어가요. 그래서 객체를 배열처럼 다룰 때는 이 규칙을 알고 있어야 해요.