매직 메서드 소개
Coddy PHP 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 91개 중 44번째.
Magic method은 이중 밑줄(__)로 시작하며 특정 이벤트나 동작에 대한 응답으로 PHP에 의해 automatically called되는 PHP의 특수한 method입니다. 이미 두 가지를 사용해 보았습니다: __construct()와 __destruct().
이러한 method를 사용하면 PHP의 내부 동작에 연결하여 객체가 일반적인 작업에 응답하는 방식을 사용자 지정할 수 있습니다.
예를 들어, 객체를 출력하려고 하면 어떤 일이 일어날까요? 또는 존재하지 않는 속성에 액세스하면 어떻게 될까요? Magic method를 사용하면 이러한 상황을 제어할 수 있습니다.
다음은 가장 일반적으로 사용되는 magic method에 대한 간단한 개요입니다:
| 메서드 | 트리거되는 경우 |
|---|---|
__construct() | object가 생성될 때 |
__destruct() | object가 소멸될 때 |
__toString() | object가 string으로 사용될 때 |
__get() | 정의되지 않은 properties에 액세스할 때 |
__set() | 정의되지 않은 properties를 설정할 때 |
__call() | 정의되지 않은 method를 호출할 때 |
__clone() | object가 복제될 때 |
<?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하려고 하면 오류가 발생합니다. magic method는 이 동작을 가로채 대신 문자열 표현을 반환합니다. 다음 수업에서는 각 magic method를 자세히 살펴보겠습니다.
챌린지
쉬움magic method을 소개하는 영화 카탈로그 시스템을 만들어 보겠습니다. Movie class를 만들고, __construct()를 사용해 영화 데이터를 초기화하며, object가 출력될 때 깔끔한 string 표현을 제공하도록 __toString()을 사용합니다.
코드를 두 개의 파일로 구성합니다.
Movie.php: 카탈로그의 영화를 나타내는Movieclass를 Create합니다. constructor promotion을 사용해$title(string),$director(string),$year(integer)에 대한 private properties를 define합니다.__toString()magic method를 Implement하여 formatted string인"[title] ([year]) - Directed by [director]"을 Return합니다. 이를 통해 별도의 method를 호출하지 않고도 movie object를 직접 echo할 수 있습니다.main.php: Movie 파일을 포함합니다. 세 가지 입력, 즉 movie title, director 이름, release year를 받습니다. 이 values를 using하여Movieinstance를 Create합니다(year는 integer로 변환). 그런 다음 movie object를 직접 echo하면 됩니다. 출력 생성을 위해__toString()method가 automatically called됩니다.
__toString()의 magic은 object가 string context에서 사용될 때마다 PHP가 automatically 이를 호출한다는 점입니다. echo $movie->getInfo();를 작성하는 대신 간단히 echo $movie;라고 작성하면 PHP가 자동으로 변환을 처리합니다. 따라서 object를 더 직관적으로 사용할 수 있습니다.
직접 해보기
<?php
require_once 'Movie.php';
// 입력 읽기
$title = trim(fgets(STDIN));
$director = trim(fgets(STDIN));
$year = intval(fgets(STDIN));
// TODO: 입력 값을 사용하여 Movie 인스턴스 생성
// TODO: movie 객체를 직접 Echo (__toString() 메서드가 자동으로 호출됩니다)
?>이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 PHP 컴파일러