매직 메서드 소개
Coddy PHP 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 91개 중 44번째.
매직 메서드(Magic methods)는 PHP의 특수 메서드로, 이중 밑줄(__)로 시작하며 특정 이벤트나 동작에 반응하여 PHP에 의해 자동으로 호출됩니다. 여러분은 이미 그중 두 가지인 __construct()와 __destruct()를 사용해 보았습니다.
이 메서드들을 사용하면 PHP의 내부 동작에 연결하여 객체가 일반적인 작업에 반응하는 방식을 사용자 정의할 수 있습니다.
예를 들어, 객체를 출력하려고 하면 어떤 일이 일어날까요? 또는 존재하지 않는 속성에 접근하면 어떻게 될까요? 매직 메서드(Magic methods)는 이러한 상황을 제어할 수 있게 해줍니다.
가장 자주 사용되는 매직 메서드들을 간략하게 살펴보겠습니다:
| 메서드 | 트리거 시점 |
|---|---|
__construct() | 객체가 생성될 때 |
__destruct() | 객체가 소멸될 때 |
__toString() | 객체가 문자열로 사용될 때 |
__get() | 정의되지 않은 속성에 접근할 때 |
__set() | 정의되지 않은 속성을 설정할 때 |
__call() | 정의되지 않은 메서드를 호출할 때 |
__clone() | 객체가 복제될 때 |
<?php
class Book {
public function __construct(
private string $title
) {}
public function __toString(): string {
return "Book: " . $this->title;
}
}
$book = new Book("PHP Mastery");
echo $book;
출력:
Book: PHP Mastery__toString()이 없으면, 객체를 echo하려고 할 때 오류가 발생합니다. 이 매직 메서드는 이 동작을 가로채서 대신 문자열 표현을 반환합니다. 이어지는 강의에서 각 매직 메서드에 대해 자세히 살펴보겠습니다.
챌린지
쉬움매직 메서드를 소개하는 영화 카탈로그 시스템을 만들어 보겠습니다. 영화 데이터를 초기화하기 위해 __construct()를 사용하고, 객체가 출력될 때 깔끔한 문자열 표현을 제공하기 위해 __toString()을 사용하는 Movie 클래스를 만들게 됩니다.
코드는 두 개의 파일로 구성됩니다:
Movie.php— 카탈로그의 영화를 나타내는Movie클래스를 생성합니다. 생성자 프로모션(constructor promotion)을 사용하여$title(string),$director(string),$year(integer)에 대한 private 속성을 정의하세요."[title] ([year]) - Directed by [director]"형식의 문자열을 반환하도록__toString()매직 메서드를 구현하세요. 이를 통해 별도의 메서드를 호출하지 않고도 영화 객체를 직접 echo할 수 있습니다.main.php— Movie 파일을 포함합니다. 영화 제목, 감독 이름, 개봉 연도의 세 가지 입력을 받게 됩니다. 이 값들을 사용하여Movie인스턴스를 생성하세요 (연도는 정수로 변환합니다). 그런 다음 영화 객체를 직접 echo하기만 하면 됩니다. 그러면__toString()메서드가 자동으로 호출되어 출력을 생성합니다.
__toString()의 마법은 객체가 문자열 컨텍스트에서 사용될 때마다 PHP가 자동으로 이를 호출한다는 점입니다. echo $movie->getInfo();라고 쓰는 대신 간단히 echo $movie;라고 작성하면 PHP가 변환을 처리해 줍니다. 이를 통해 객체를 훨씬 더 직관적으로 다룰 수 있습니다.
치트 시트
매직 메서드(Magic methods)는 PHP에서 두 개의 밑줄(__)로 시작하는 특별한 메서드로, 특정 이벤트나 동작에 반응하여 PHP에 의해 자동으로 호출됩니다.
일반적인 매직 메서드:
| 메서드 | 호출 시점 |
|---|---|
__construct() | 객체가 생성될 때 |
__destruct() | 객체가 소멸될 때 |
__toString() | 객체가 문자열로 사용될 때 |
__get() | 정의되지 않은 속성에 접근할 때 |
__set() | 정의되지 않은 속성을 설정할 때 |
__call() | 정의되지 않은 메서드를 호출할 때 |
__clone() | 객체가 복제될 때 |
__toString() 메서드는 객체의 문자열 표현을 반환합니다:
<?php
class Book {
public function __construct(
private string $title
) {}
public function __toString(): string {
return "Book: " . $this->title;
}
}
$book = new Book("PHP Mastery");
echo $book; // 출력: Book: PHP Mastery
__toString()이 없으면 객체를 echo하려고 할 때 오류가 발생합니다. 매직 메서드는 이 동작을 가로채어 객체가 문자열 컨텍스트에서 사용될 수 있도록 합니다.
직접 해보기
<?php
require_once 'Movie.php';
// 입력 읽기
$title = trim(fgets(STDIN));
$director = trim(fgets(STDIN));
$year = intval(fgets(STDIN));
// TODO: 입력 값을 사용하여 Movie 인스턴스 생성
// TODO: movie 객체를 직접 출력 (__toString() 메서드가 자동으로 호출됨)
?>이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
8매직 메서드
매직 메서드 소개__toString 및 __debugInfo__get, __set, __isset, __unset__call 및 __callStatic__clone 및 객체 복제__serialize 및 __unserialize요약 - 커스텀 컬렉션