PHP에서 호출자 함수의 이름을 얻습니까?


135

주어진 함수에서 호출자 함수의 이름을 찾는 PHP 함수가 있습니까?


Xdebug를 사용해야합니다. 이 게시물에 내 대답을 참조하십시오 : stackoverflow.com/questions/1513069/…
svassr

13
Xdebug는 단순히 원래 요청 인 PHP 함수가 아닙니다. 예를 들어 이후 PHP 로직에서 호출자 함수 이름을 사용하고 프로덕션 서버에 XDebug를 설치하지 않으려면 PHP 함수가 필요합니다.
JP

답변:


198

debug_backtrace를 참조하십시오. 이렇게하면 콜 스택을 맨 위까지 추적 할 수 있습니다.

발신자를 얻는 방법은 다음과 같습니다.

$trace = debug_backtrace();
$caller = $trace[1];

echo "Called by {$caller['function']}";
if (isset($caller['class']))
    echo " in {$caller['class']}";

59
이것은 수신자 함수 이름을 인쇄하는 것으로 보입니다. 성능 list(, $caller) = debug_backtrace(false);을 위해 발신자를 얻는 데 사용 false;-) (php5.3)
Znarkus

웹에서 볼 수있는 많은 솔루션은 백 트레이스 배열의 두 번째 요소를 가져 와서 인스턴스 호출자를 얻습니다. 확신 할 수 있습니까? 두 번째 요소는 항상 우리가 찾고있는 요소입니까? parent :: __ construct ()와 같은 다른 호출 내부에 포함 된 __construct ()는 실제 호출자 (아직 시도하지 않은)의 다른 위치를 옮길 수 있다고 생각했습니다.
에마누엘레 델 그란데

1
ReflectionClass를 사용하는 동안 반환 된 호출자의 순서를 확인하려고 시도한 결과 사용자 인터페이스에 표시되는 "실제"호출자 메서드의 위치가 변경되므로 백 트레이스 위치에 대한 가정을 할 수 없습니다.
에마누엘레 델 그란데

4
배열 이동은 첫 번째 요소를 제거하고 제거 된 요소를 반환합니다. 원래 배열이 수정 될 것이며 이것은 필요한 결과를 제공해야합니다echo 'called by '.$trace[0]['function']
GoodSp33d

21
debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2)[1]['function'];더 나은 성능으로 발신자 이름을 얻습니다.
ahuigo

17

Xdebug는 훌륭한 기능을 제공합니다.

<?php
  Class MyClass
  {
    function __construct(){
        $this->callee();
    }
    function callee() {
        echo sprintf("callee() called @ %s: %s from %s::%s",
            xdebug_call_file(),
            xdebug_call_line(),
            xdebug_call_class(),
            xdebug_call_function()
        );
    }
  }
  $rollDebug = new MyClass();
?>

추적을 반환합니다

callee() called @ /var/www/xd.php: 16 from MyClass::__construct

우분투에 Xdebug를 설치하는 가장 좋은 방법은

sudo aptitude install php5-xdebug

먼저 php5-dev를 설치해야 할 수도 있습니다

sudo aptitude install php5-dev

더 많은 정보


15

이것은 매우 늦었지만 현재 함수가 호출되는 함수의 이름을 제공하는 함수를 공유하고 싶습니다.

public function getCallingFunctionName($completeTrace=false)
    {
        $trace=debug_backtrace();
        if($completeTrace)
        {
            $str = '';
            foreach($trace as $caller)
            {
                $str .= " -- Called by {$caller['function']}";
                if (isset($caller['class']))
                    $str .= " From Class {$caller['class']}";
            }
        }
        else
        {
            $caller=$trace[2];
            $str = "Called by {$caller['function']}";
            if (isset($caller['class']))
                $str .= " From Class {$caller['class']}";
        }
        return $str;
    }

이것이 도움이 되길 바랍니다.


1
당신은 가장 환영합니다 David! 나는 또한 내 프로젝트에서 디버깅 목적으로 이것을 사용하고 있습니다 :)
MANISH ZOPE

"완료 추적"모드는 매우 유용합니다. 공유해 주셔서 감사합니다.
Leopoldo Sanczyk

15

debug_backtrace() 현재 호출 스택에서 매개 변수, 함수 / 방법 호출에 대한 세부 사항을 제공합니다.


9
echo debug_backtrace()[1]['function'];

PHP 5.4 부터 작동합니다 .

또는 최적화 (예 : 비디 버그 사용 사례) :

echo debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS, 2)[1]['function'];

첫 번째 인수는 사용되지 않은 함수 인수를 채우지 못하게하고 두 번째 인수는 추적을 두 레벨로 제한합니다 (두 번째가 필요함).


7

이것을 만들고 이것을 직접 사용

/**
 * Gets the caller of the function where this function is called from
 * @param string what to return? (Leave empty to get all, or specify: "class", "function", "line", "class", etc.) - options see: http://php.net/manual/en/function.debug-backtrace.php
 */
function getCaller($what = NULL)
{
    $trace = debug_backtrace();
    $previousCall = $trace[2]; // 0 is this call, 1 is call in previous function, 2 is caller of that function

    if(isset($what))
    {
        return $previousCall[$what];
    }
    else
    {
        return $previousCall;
    }   
}

3

플로어의 방법은 항상 호출자 대신 호출 된 함수 이름을 반환하기 때문에 함수로 작동하지 않는다고 말하고 싶었지만 주석으로 평판을 얻지 못했습니다. 내 경우에 잘 작동하는 flori의 답변을 기반으로 매우 간단한 기능을 만들었습니다.

class basicFunctions{

    public function getCallerFunction(){
        return debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS, 3)[2]['function'];
    }

}

예:

function a($authorisedFunctionsList = array("b")){
    $ref = new basicFunctions;
    $caller = $ref->getCallerFunction();

    if(in_array($caller,$authorisedFunctionsList)):
        echo "Welcome!";
        return true;
    else:
        echo "Unauthorised caller!";
        return false; 
    endif;
}

function b(){
    $executionContinues = $this->a();
    $executionContinues or exit;

    //Do something else..
}




1

이것은 작동해야합니다 :

$caller = next(debug_backtrace())['function'];

0

이것은 잘 할 것입니다 :


// Outputs an easy to read call trace
// Credit: https://www.php.net/manual/en/function.debug-backtrace.php#112238
// Gist: https://gist.github.com/UVLabs/692e542d3b53e079d36bc53b4ea20a4b

Class MyClass{

public function generateCallTrace()
{
    $e = new Exception();
    $trace = explode("\n", $e->getTraceAsString());
    // reverse array to make steps line up chronologically
    $trace = array_reverse($trace);
    array_shift($trace); // remove {main}
    array_pop($trace); // remove call to this method
    $length = count($trace);
    $result = array();
   
    for ($i = 0; $i < $length; $i++)
    {
        $result[] = ($i + 1)  . ')' . substr($trace[$i], strpos($trace[$i], ' ')); // replace '#someNum' with '$i)', set the right ordering
    }
   
    return "\t" . implode("\n\t", $result);
}

}

// call function where needed to output call trace

/**
Example output:
1) /var/www/test/test.php(15): SomeClass->__construct()
2) /var/www/test/SomeClass.class.php(36): SomeClass->callSomething()
**/```
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.