PHP의 함수 안에서 함수 이름을 어떻게 얻습니까?


235

가능합니까?

function test()
{
  echo "function name is test";
}

1
호기심 때문에 언제 필요할까요? 이름을 모르는 함수를 만들 수 있습니까?
Disgruntled 염소

37
하나의 가능한 용도는 실행을 기록하는 것입니다. "에 오류가 있습니다"라고 쓰고 있다면 로그 파일 또는 다른 기능 . 이런 식으로, 기능 이름이 변경되면 로그 메시지 변경을 기억하는 사람에 대해 걱정할 필요가 없습니다.
Brian Ramsay

1
로깅에 필요했습니다! 물어 주셔서 감사합니다 :)
SublymeRick

2
함수 내에서 함수 이름을 사용하려는 경우에도 유용합니다 (다른 용도로). 함수 등을 기반으로 링크를 구성하는 등 (예 : 내부에서 name1을 다시 function name1()사용 ) 많은 함수에 대해 동일한 템플릿이 있으면 많은 시간을 절약 할 수 있습니다.
Mafia

1
@DisgruntledGoat : 함수를 수동으로 작성하고 모든 함수에 대한 오류 메시지를 편집하지 않으려는 경우에 유용합니다. 오류 메시지에 추가하면 작업이 줄어 듭니다.
John Boe

답변:


390

정확한 방법은 __FUNCTION__ 미리 정의 된 매직 상수 를 사용하는 것 입니다.

예:

class Test {
    function MethodA(){
        echo __FUNCTION__;
    }
}

결과 : MethodA.


6
FUNCTION 은 비 클래스 함수에서도 작동합니다. PHP 7.0.8에서 시도했습니다.
mvsagar

같은 방법으로 클래스 이름을 얻는 방법?
Kiran Reddy

2
@KiranReddy 이것에도 마법 상수가 있습니다 : __CLASS__. 아니면 할 수 있습니다 get_class($this).
숀 더 빈

1
PHP에서 시도> = 4
Nabi KAZ

98

메소드 또는 함수인지에 따라 매직 상수 __METHOD__ (클래스 이름 포함) 또는 __FUNCTION__(함수 함수 이름)을 사용할 수 있습니다 ... =)


42
METHOD 에는 클래스 이름이 포함되어 있으며 FUNCTION 은 바로 그 것입니다. 후자는 클래스의 메소드에서 동일하게 사용할 수 있습니다.
Alister Bulman

3
사실입니다. 그러나 methodName 대신 MyClass :: methodName을 얻는 것이 종종 유용합니다.
PatrikAkerstrand

16

PHP 5를 사용하는 경우 다음을 시도하십시오.

function a() {
    $trace = debug_backtrace();
    echo $trace[0]["function"];
}

14
이것은 엄청난 자원 집약적입니다. FUNCTION 또는 METHOD를 사용하는 것이 훨씬 더 효율적입니다. 함수 이름 이상이 필요한 경우 debug_backtrace ()가 좋습니다.
Luke Cousins

2
이 목적으로 debug_backtrace ()를 사용하는 것은 나쁜 습관입니다.
Marcio Mazzucato

1
이는 IS ONLY CORRECT WAY 제가 발견 !!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! !!!!!!!!!!!!!! __FUNCTION__부모 함수 이름을 반환 하기 때문에 (현재 함수가 부모 함수에 포함 된 경우)
T.Todua

5
@tazo todua. 예를 들어 줄 수 있습니까?
alds

2
<?php

  class Test {
     function MethodA(){
         echo __FUNCTION__ ;
     }
 }
 $test = new Test;
 echo $test->MethodA();
?>

결과 : "MethodA";


이 코드 스 니펫이 해결책이 될 수 있지만 설명을 포함하면 게시물의 품질을 향상시키는 데 실제로 도움이됩니다. 앞으로 독자에게 질문에 대한 답변을 제공하고 있으며 해당 사람들이 코드 제안의 이유를 모를 수도 있습니다.
SilverNak
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.