PHP 매직 메서드란?
PHP의 매직 메서드(Magic Methods)는 특정 상황에서 자동으로 호출되어 특별한 작업을 수행하도록 설계된 특수 메서드입니다. 이 메서드들은 항상 더블 언더스코어(__)를 접두사로 가지며, 메서드 이름은 PHP에 의해 예약되어 있으므로 매직 기능 이외의 용도로는 사용할 수 없습니다.
클래스 내에서 매직 메서드는 반드시 public으로 선언해야 하며, 특정 조건이 충족되면 PHP 엔진에 의해 자동으로 호출되는 일종의 인터셉터(interceptor) 역할을 합니다.
현재 PHP에서 사용할 수 있는 주요 매직 메서드는 다음과 같습니다.
__sleep
public __sleep ( void ) : array
serialize() 함수는 객체를 직렬화하기 전에 해당 클래스에 __sleep() 메서드가 정의되어 있는지 확인합니다. 정의되어 있다면 직렬화 작업에 앞서 이 메서드가 먼저 실행되며, 직렬화 대상이 되는 객체의 변수 이름들을 담은 배열을 반환해야 합니다. 이를 통해 직렬화할 속성을 선택적으로 제어할 수 있습니다.
__wakeup
public __wakeup ( void ) : void
unserialize() 함수는 __wakeup()이라는 매직 이름의 메서드가 존재하는지 확인합니다. 존재한다면 역직렬화 과정에서 이 메서드가 호출되며, 데이터베이스 연결 등 객체가 필요로 하는 리소스를 재구성하는 데 활용할 수 있습니다.
__serialize
public __serialize ( void ) : array
serialize() 함수는 클래스에 __serialize() 메서드가 있는지도 확인합니다. 정의되어 있다면 직렬화 전에 실행되며, 객체의 직렬화 형태를 나타내는 키/값 쌍의 연관 배열을 반드시 생성하여 반환해야 합니다. PHP 7.4부터 도입된 이 메서드는 __sleep()보다 유연한 직렬화 제어를 제공합니다.
__unserialize
public __unserialize ( array $data ) : void
unserialize() 함수 역시 __unserialize() 메서드의 존재 여부를 확인하고, 정의되어 있다면 __serialize()가 반환했던 배열이 그대로 전달됩니다. 이 메서드 안에서 전달받은 배열로부터 객체의 속성을 적절하게 복원하면 됩니다.
__toString
public __toString ( void ) : string
__toString() 메서드는 객체가 문자열로 취급될 때의 표현을 정의합니다. 예를 들어 echo $obj;를 실행했을 때 출력될 내용을 결정합니다. 이 메서드는 반드시 문자열을 반환해야 하며, 그렇지 않으면 치명적인 오류(fatal error)가 발생합니다.
__invoke
__invoke ([ $... ] ) : mixed
__invoke() 메서드는 스크립트가 객체를 함수처럼 호출하려고 시도할 때 자동으로 호출됩니다. 즉, $obj($arg)와 같이 객체를 callable로 사용할 수 있게 해줍니다.
__set_state
static __set_state ( array $properties ) : object
__set_state()는 var_export()로 클래스 객체를 내보낼 때 호출되는 static 메서드입니다. array('property' => value, ...) 형태로 내보낸 속성들을 담은 배열 하나를 매개변수로 받으며, 이를 기반으로 객체를 재구성하여 반환해야 합니다.
__debugInfo
__debugInfo ( void ) : array
var_dump()로 객체를 덤프할 때 어떤 속성을 보여줄지 결정하기 위해 __debugInfo() 메서드가 자동으로 호출됩니다. 이 메서드가 정의되어 있지 않으면 객체의 public, protected, private 속성이 모두 출력됩니다. 디버깅 시 민감한 정보를 숨기고 싶을 때 유용합니다.
오버로딩 관련 매직 메서드
다음 네 가지 매직 메서드는 접근할 수 없거나 존재하지 않는 속성(property)에 대한 조작을 가로채는 속성 오버로딩(Property Overloading) 메서드입니다.
__set
public __set ( string $name , mixed $value ) : void
__set()은 접근 불가능(protected 또는 private)하거나 존재하지 않는 속성에 데이터를 쓰려고 할 때 실행됩니다.
__get
public __get ( string $name ) : mixed
__get()은 접근 불가능하거나 존재하지 않는 속성으로부터 데이터를 읽으려고 할 때 사용됩니다.
__isset
public __isset ( string $name ) : bool
__isset()은 접근 불가능하거나 존재하지 않는 속성에 대해 isset() 또는 empty()를 호출할 때 트리거됩니다.
__unset
public __unset ( string $name ) : void
__unset()은 접근 불가능하거나 존재하지 않는 속성에 unset()을 사용할 때 호출됩니다.
마무리
매직 메서드를 잘 활용하면 직렬화 제어, 객체의 문자열 변환, 함수형 호출, 디버깅 정보 관리, 동적 속성 처리 등 다양한 기능을 우아하게 구현할 수 있습니다. 다만 남용하면 코드의 흐름을 추적하기 어려워질 수 있으므로, 실제로 필요한 상황에서 적절히 사용하는 것이 좋습니다.