IT

PHP에서 호출 함수/메서드의 이름을 얻는 방법은?

itgroup 2022. 11. 18. 21:35
반응형

PHP에서 호출 함수/메서드의 이름을 얻는 방법은?

을 .debug_backtrace ,, 음, 음, 음, 음, 다, 다, 다, 다, 다, ,, ,, to 등의 기능을 구현할 수 있는 기능을 찾고 .GetCallingMethodName()방법

가장 간단한 방법은 다음과 같습니다.

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

아래 코멘트에서 설명한 바와 같이 이는 인수를 전달함으로써 더욱 최적화될 수 있습니다.

  • object ★★★★★★★★★★★★★★★★★」args
  • 반환되는 스택프레임 수 제한
echo debug_backtrace(!DEBUG_BACKTRACE_PROVIDE_OBJECT|DEBUG_BACKTRACE_IGNORE_ARGS,2)[1]['function'];

debug_backtrace()알 수 있는 가 하나 더 .게을러진다면, 이것은 코드화할 필요가 있는 또 하나의 이유입니다.GetCallingMethodName()네 자신.게으름에 맞서라! :D.

php 5.4를 사용하실 수 있습니다.

        $dbt=debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS,2);
        $caller = isset($dbt[1]['function']) ? $dbt[1]['function'] : null;

이렇게 하면 인수를 무시하고 마지막 2개의 백트레이스 스택엔트리만 반환되므로 메모리가 낭비되지 않습니다.또, 여기서의 다른 응답으로서 통지가 생성되지 않습니다.

php 예외에 의해 제공되는 정보를 사용할 수도 있습니다.이것은 우아한 솔루션입니다.


함수 GetCallingMethodName(){$e = 새로운 예외();$sec = $e-> getTrace();//위치 0은 이 함수를 호출한 회선이므로 무시합니다.$last_call = $last[1];
print_r'last_call);
}
firstCall 함수($a, $b){더콜($a, $b);}
함수 theCall($a, $b){GetCallingMethodName();}
first Call('lucia', 'php');

그리고 당신은 이걸...(부라!)

어레이([파일] => /home/lufigueroa/데스크탑/테스트.php[line] => 12[기능] => 통화[backs] => 어레이([0] => 루시아[1] => php)
)

는 ★★★★★★★★★★★★★★★★★★.debug_backtrace메모리의 한계에 도달하고 있어, 에러가 발생했을 때의 로그나 E-메일을 실전 가동에 사용하고 싶다고 생각하고 있습니다.

대신 이 솔루션이 훌륭하게 작동했습니다!

// Make a new exception at the point you want to trace, and trace it!
$e = new Exception;
var_dump($e->getTraceAsString());

// Outputs the following 
#2 /usr/share/php/PHPUnit/Framework/TestCase.php(626): SeriesHelperTest->setUp()
#3 /usr/share/php/PHPUnit/Framework/TestResult.php(666): PHPUnit_Framework_TestCase->runBare()
#4 /usr/share/php/PHPUnit/Framework/TestCase.php(576): PHPUnit_Framework_TestResult->run(Object(SeriesHelperTest))
#5 /usr/share/php/PHPUnit/Framework/TestSuite.php(757): PHPUnit_Framework_TestCase->run(Object(PHPUnit_Framework_TestResult))
#6 /usr/share/php/PHPUnit/Framework/TestSuite.php(733): PHPUnit_Framework_TestSuite->runTest(Object(SeriesHelperTest), Object(PHPUnit_Framework_TestResult))
#7 /usr/share/php/PHPUnit/TextUI/TestRunner.php(305): PHPUnit_Framework_TestSuite->run(Object(PHPUnit_Framework_TestResult), false, Array, Array, false)
#8 /usr/share/php/PHPUnit/TextUI/Command.php(188): PHPUnit_TextUI_TestRunner->doRun(Object(PHPUnit_Framework_TestSuite), Array)
#9 /usr/share/php/PHPUnit/TextUI/Command.php(129): PHPUnit_TextUI_Command->run(Array, true)
#10 /usr/bin/phpunit(53): PHPUnit_TextUI_Command::main()
#11 {main}"

내가 제일 좋아하는 방법, 한 줄로!

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

다음과 같이 사용할 수 있습니다.

echo 'The calling function: ' . debug_backtrace()[1]['function'];

이는 지난해 출시된 PHP 버전과만 호환된다는 점에 유의하십시오.그러나 보안상의 이유로 PHP를 최신 상태로 유지하는 것이 좋습니다.

방금 'get_caller'라는 버전을 썼는데 도움이 됐으면 좋겠어요.저는 게을러요.함수에서 get_caller()만 실행할 수 있습니다.이렇게 지정할 필요는 없습니다.

get_caller(__FUNCTION__);

다음은 기발한 테스트 케이스가 포함된 스크립트입니다.

<?php

/* This function will return the name string of the function that called $function. To return the
    caller of your function, either call get_caller(), or get_caller(__FUNCTION__).
*/
function get_caller($function = NULL, $use_stack = NULL) {
    if ( is_array($use_stack) ) {
        // If a function stack has been provided, used that.
        $stack = $use_stack;
    } else {
        // Otherwise create a fresh one.
        $stack = debug_backtrace();
        echo "\nPrintout of Function Stack: \n\n";
        print_r($stack);
        echo "\n";
    }

    if ($function == NULL) {
        // We need $function to be a function name to retrieve its caller. If it is omitted, then
        // we need to first find what function called get_caller(), and substitute that as the
        // default $function. Remember that invoking get_caller() recursively will add another
        // instance of it to the function stack, so tell get_caller() to use the current stack.
        $function = get_caller(__FUNCTION__, $stack);
    }

    if ( is_string($function) && $function != "" ) {
        // If we are given a function name as a string, go through the function stack and find
        // it's caller.
        for ($i = 0; $i < count($stack); $i++) {
            $curr_function = $stack[$i];
            // Make sure that a caller exists, a function being called within the main script
            // won't have a caller.
            if ( $curr_function["function"] == $function && ($i + 1) < count($stack) ) {
                return $stack[$i + 1]["function"];
            }
        }
    }

    // At this stage, no caller has been found, bummer.
    return "";
}

// TEST CASE

function woman() {
    $caller = get_caller(); // No need for get_caller(__FUNCTION__) here
    if ($caller != "") {
        echo $caller , "() called " , __FUNCTION__ , "(). No surprises there.\n";
    } else {
        echo "no-one called ", __FUNCTION__, "()\n";
    }
}

function man() {
    // Call the woman.
    woman();
}

// Don't keep him waiting
man();

// Try this to see what happens when there is no caller (function called from main script)
//woman();

?>

get_calling get_calling()을 호출하는 woman()은 woman()이 주의를 기울여서 알리지 않았기 때문에 get_calling get_calling()을 호출한 woman()을 호출한 woman()을 아직 호출한 사람이 누구인지 알 수 없습니다.그런 다음 누가 woman()을 호출했는지 반환합니다.또한 브라우저의 소스 코드 모드의 출력에는 함수 스택이 표시됩니다.

Printout of Function Stack: 

Array
(
    [0] => Array
        (
            [file] => /Users/Aram/Development/Web/php/examples/get_caller.php
            [line] => 46
            [function] => get_caller
            [args] => Array
                (
                )

        )

    [1] => Array
        (
            [file] => /Users/Aram/Development/Web/php/examples/get_caller.php
            [line] => 56
            [function] => woman
            [args] => Array
                (
                )

        )

    [2] => Array
        (
            [file] => /Users/Aram/Development/Web/php/examples/get_caller.php
            [line] => 60
            [function] => man
            [args] => Array
                (
                )

        )

)

man() called woman(). No surprises there.

호출 클래스/메서드(Magento 프로젝트 작업)만 나열할 수 있는 것이 필요했습니다.

하는 동안에debug_backtrace수많은 유용한 정보를 제공합니다.Magento 설치를 위해 쏟아낸 정보의 양은 압도적입니다(82,000 회선이 넘습니다).저는 호출 기능과 클래스에만 관심이 있었기 때문에 다음과 같은 작은 해결책을 마련했습니다.

$callers = debug_backtrace();
foreach( $callers as $call ) {
    echo "<br>" . $call['class'] . '->' . $call['function'];
}

부모 함수명을 취득하는 가장 간단한 방법은 다음과 같습니다.

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

내가 본 질문의 가장 좋은 답은 다음과 같다.

list(, $caller) = debug_backtrace(false);

짧고 깔끔함

언급URL : https://stackoverflow.com/questions/2110732/how-to-get-name-of-calling-function-method-in-php

반응형