programing

PHP에서 호출자 함수의 이름을 가져오시겠습니까?

newsource 2022. 9. 18. 12:48

PHP에서 호출자 함수의 이름을 가져오시겠습니까?

특정 함수에 있는 호출자 함수의 이름을 알아내는 PHP 함수가 있습니까?

debug_backtrace 를 참조해 주세요.이것에 의해, 콜 스택이 선두까지 트레이스 됩니다.

전화를 거는 방법은 다음과 같습니다.

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

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

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

Ubuntu에 Xdebug를 설치하는 가장 좋은 방법은

sudo aptitude install php5-xdebug

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

sudo aptitude install php5-dev

상세 정보

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

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;
    }

이게 도움이 됐으면 좋겠어요.

debug_backtrace() 에 현재 콜 스택 내의 파라미터, 기능/기능 콜의 상세 내용을 나타냅니다.

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

PHP 5.4부터 동작합니다.

또는 최적화된 경우(예: 비디버깅 사용 사례):

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

첫 번째 인수는 미사용 함수 인수에 대한 입력을 금지하고 두 번째 인수는 트레이스를 2가지 레벨로 제한합니다(두 번째 인수가 필요합니다).

이걸 직접 만들어서 사용했어요.

/**
 * 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;
    }   
}

flori의 방식은 발신자가 아닌 호출된 함수명을 항상 반환하기 때문에 함수로 기능하지 않는다고 말하고 싶었을 뿐이지만, 코멘트를 할 만한 평판은 없습니다.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..
}

debug_backtrace에 의해 반환된 어레이에서 이 정보를 추출할 수 있습니다.

이 방법이 가장 효과적이었어var_dump(debug_backtrace());

실제로 debug_print_backtrace()는 필요한 기능을 수행합니다.http://php.net/manual/en/function.debug-print-backtrace.php

이 조작은 유효합니다.

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

이것으로 충분합니다.


// 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()
**/```

사용자가 읽을 수 있는 방법으로 발신자 메서드의 트레이스를 보고 싶은 많은 사람에게 도움이 되는 범용 클래스를 만들었습니다.내 프로젝트 중 하나에서와 마찬가지로 우리는 그러한 정보를 기록해야 했다.

use ReflectionClass;

class DebugUtils
{
    /**
     * Generates debug traces in user readable form
     *
     * @param integer $steps
     * @param boolean $skipFirstEntry
     * @param boolean $withoutNamespaces
     * @return string
     */
    public static function getReadableBackTracke(
        $steps = 4,
        $skipFirstEntry = true,
        $withoutNamespaces = true
    ) {
        $str = '';
        try {
            $backtrace = debug_backtrace(false, $steps);

            // Removing first array entry
            // to make sure getReadableBackTracke() method doesn't gets displayed
            if ($skipFirstEntry)
                array_shift($backtrace);

            // Reserved, so it gets displayed in calling order
            $backtrace = array_reverse($backtrace);

            foreach ($backtrace as $caller) {
                if ($str) {
                    $str .= ' --> ';
                }
                if (isset($caller['class'])) {
                    $class = $caller['class'];
                    if ($withoutNamespaces) {
                        $class = (new ReflectionClass($class))->getShortName();
                    }
                    $str .= $class . $caller['type'];
                }
                $str .= $caller['function'];
            }
        } catch (\Throwable $th) {
            return null;
        }

        return $str;
    }
}

사용방법:DebugUtils::getReadableBackTracke()

샘플 출력:

SomeClass->method1 --> SomeOtherClass->method2 --> TargetClass->targetMethod

좋은 일을 하고 다른 사람을 계속 도와라, 행복한 코딩:)

언급URL : https://stackoverflow.com/questions/190421/get-name-of-caller-function-in-php