개요
PHP에서 '오버로딩(Overloading)'의 의미는 C++이나 Java 같은 다른 객체지향 언어와는 다르게 해석됩니다. C++이나 Java에서 오버로딩은 같은 이름의 메서드를 서로 다른 인수 목록이나 반환 타입으로 여러 번 정의하는 기능을 뜻합니다. 반면 PHP에서 오버로딩은 존재하지 않거나 접근할 수 없는 프로퍼티와 메서드를 동적으로 생성하고 처리하는 기능을 의미합니다.
PHP는 이러한 동적 처리를 위해 매직 메서드(Magic Methods)를 제공합니다. 매직 메서드란 이름이 더블 언더스코어(__)로 시작하는 특수 메서드로, 개발자가 직접 호출하는 것이 아니라 특정 상황에서 PHP 엔진이 자동으로 호출합니다.
프로퍼티 오버로딩
프로퍼티 오버로딩에는 다음 네 가지 매직 메서드가 사용됩니다.
문법
public __set ( string $name , mixed $value ) : void public __get ( string $name ) : mixed public __isset ( string $name ) : bool public __unset ( string $name ) : void
각 메서드의 역할
- __set(): protected나 private처럼 접근할 수 없는 프로퍼티, 혹은 존재하지 않는 프로퍼티에 데이터를 쓸 때 실행됩니다.
- __get(): 접근할 수 없는 프로퍼티에서 데이터를 읽을 때 실행됩니다.
- __isset(): 접근할 수 없는 프로퍼티에 대해 isset()이나 empty()를 호출할 때 실행됩니다.
- __unset(): 접근할 수 없는 프로퍼티에 unset()을 호출할 때 실행됩니다.
예제
다음 코드에서는 myprop이라는 동적 프로퍼티를 설정(set), 조회(get), 해제(unset)하는 과정을 보여줍니다.
<?php
class myclass{
public function __set($name, $value){
echo "$name 프로퍼티를 $value 로 설정\n";
$this->$name = $value;
}
public function __get($name){
echo "$name 프로퍼티의 값은 ";
return $this->$name;
}
public function __isset($name){
return isset($this->$name);
}
public function __unset($name){
unset($this->$name);
}
}
$obj = new myclass();
$obj->myprop="test";
echo $obj->myprop . "\n";
var_dump (isset($obj->myprop));
unset($obj->myprop);
var_dump (isset($obj->myprop));
?>실행 결과
setting myprop property to test test bool(true) bool(false)
실행 결과를 보면 myprop이라는 실제로 정의되지 않은 프로퍼티에 값을 할당했을 때 __set()이 자동으로 호출되어 프로퍼티가 동적으로 생성되었고, 읽을 때는 __get(), 존재 여부 확인 시에는 __isset(), 삭제 시에는 __unset()이 각각 트리거된 것을 확인할 수 있습니다.
메서드 오버로딩
메서드를 동적으로 처리하는 데 사용되는 매직 메서드는 __call()과 __callStatic() 두 가지입니다.
public __call ( string $name , array $arguments ) : mixed public static __callStatic ( string $name , array $arguments ) : mixed
- __call(): 객체 컨텍스트에서 접근할 수 없는 메서드를 호출할 때 트리거됩니다.
- __callStatic(): 정적(static) 컨텍스트에서 접근할 수 없는 메서드를 호출할 때 트리거됩니다.
예제
<?php
class myclass{
public function __call($name, $args){
// 참고: $name 값은 대소문자를 구분합니다.
echo "객체 메서드 $name 을 " . implode(" ", $args). " 인수로 호출\n";
}
public static function __callStatic($name, $args){
echo "정적 메서드 $name 을 " . implode(" ", $args). " 인수로 호출\n";
}
}
$obj = new myclass();
$obj->mymethod("Hello World!");
myclass::mymethod("Hello World!");
?>실행 결과
Calling object method mymethod with Hello World! Calling static method mymethod with Hello World!
클래스에 mymethod라는 메서드가 실제로 정의되어 있지 않음에도 불구하고, 객체 문법($obj->mymethod())으로 호출하면 __call()이, 정적 문법(myclass::mymethod())으로 호출하면 __callStatic()이 각각 자동으로 실행되는 것을 볼 수 있습니다.
정리
PHP의 오버로딩은 다른 언어의 함수 오버로딩과 달리, 매직 메서드를 통해 존재하지 않는 프로퍼티나 메서드에 대한 접근을 유연하게 가로채고 처리하는 메커니즘입니다. 이를 활용하면 유연한 API 설계, 지연 로딩(lazy loading), 프록시 패턴 구현 등 다양한 고급 프로그래밍 기법을 적용할 수 있습니다.