PHP에서는 매직 상수(magic constants)를 사용하면 현재 실행 중인 함수나 메서드의 이름을 손쉽게 확인할 수 있습니다. 대표적으로 __FUNCTION__과 __METHOD__ 두 가지 상수가 사용되는데, 이 둘의 차이점을 예제를 통해 살펴보겠습니다.
예제 1: __FUNCTION__ 사용하기
__FUNCTION__은 현재 실행 중인 함수의 이름만 반환합니다. 클래스 메서드 내부에서 사용하더라도 클래스 이름 없이 함수 이름만 출력됩니다.
<?php
class Base {
function display() {
echo "\nBase class function declared final!";
var_dump(__FUNCTION__);
}
function demo() {
echo "\nBase class function!";
}
}
class Derived extends Base {
function demo() {
echo "\nDerived class function!";
}
}
$ob = new Base;
$ob->demo();
$ob->display();
$ob2 = new Derived;
$ob2->demo();
$ob2->display();
?>출력 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
Base class function! Base class function declared final!string(7) "display" Derived class function! Base class function declared final!string(7) "display"
$ob2->display()를 호출했을 때도 display라는 문자열이 그대로 반환된 것을 볼 수 있습니다. 이는 Derived 클래스가 display() 메서드를 오버라이딩하지 않았기 때문에 부모 클래스인 Base의 메서드가 그대로 호출되기 때문입니다.
예제 2: __METHOD__ 사용하기
__METHOD__는 클래스 이름까지 함께 반환합니다. 즉, '클래스이름::메서드이름' 형태로 출력되어 어느 클래스의 메서드가 호출되었는지 정확히 파악할 수 있습니다.
<?php
class Base {
function display() {
echo "\nBase class function declared final!";
var_dump(__FUNCTION__);
}
function demo() {
echo "\nBase class function!";
var_dump(__METHOD__);
}
}
class Derived extends Base {
function demo() {
echo "\nDerived class function!";
}
}
$ob = new Base;
$ob->demo();
$ob->display();
$ob2 = new Derived;
$ob2->demo();
$ob2->display();
?>출력 결과
Base class function!string(10) "Base::demo" Base class function declared final!string(7) "display" Derived class function! Base class function declared final!string(7) "display"
__FUNCTION__과 __METHOD__의 차이점
두 매직 상수의 차이를 정리하면 다음과 같습니다.
- __FUNCTION__: 현재 함수 또는 메서드의 이름만 반환합니다. (예:
"demo") - __METHOD__: 클래스 이름과 메서드 이름을 함께 반환합니다. (예:
"Base::demo")
일반적인 함수에서는 두 상수 모두 같은 값을 반환하지만, 클래스 메서드 내부에서는 용도에 따라 적절한 상수를 선택하는 것이 좋습니다. 디버깅이나 로깅 시 어떤 클래스의 메서드가 실행되었는지 추적해야 한다면 __METHOD__가 더 유용하고, 단순히 함수 이름만 필요하다면 __FUNCTION__을 사용하면 됩니다.