257

私は function を認識していますdebug_backtraceが、次のような関数の実装をすぐに使用できるものを探していGetCallingMethodName()ますか? メソッドのクラスも指定すれば完璧です (それが実際にメソッドである場合)。

4

10 に答える 10

607

最も簡単な方法は次のとおりです。

echo debug_backtrace()[1]['function'];
于 2012-06-28T04:24:57.763 に答える
163

関数はこれdebug_backtrace()を知る唯一の方法です。もしあなたが怠け者なら、GetCallingMethodName()自分でコーディングする必要があるもう 1 つの理由です。怠惰と戦え!:D

于 2010-01-21T16:13:12.160 に答える
64

PHP 5.4以降、使用できます

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

これは、引数を無視して最後の 2 つのバックトレース スタック エントリのみを返すため、メモリを浪費せず、他の回答として通知を生成しません。

于 2015-02-19T09:02:20.890 に答える
34

PHP 例外によって提供される情報を使用することもできます。これは洗練されたソリューションです。

関数 GetCallingMethodName(){
    $e = 新しい例外 ();
    $trace = $e->getTrace();
    //位置 0 がこの関数を呼び出した行になるため、無視します
    $last_call = $trace[1];
    print_r($last_call);
}

関数 firstCall($a, $b){
    theCall($a, $b);
}

関数 theCall($a, $b){
    GetCallingMethodName();
}

firstCall('ルシア', 'php');

そして、あなたはこれを手に入れます...(出来上がり!)

配列
(
    [ファイル] => /home/lufigueroa/Desktop/test.php
    [行] => 12
    [関数] => theCall
    [args] => 配列
        (
            [0] => ルチア
            [1] => php
        )

)
于 2012-02-03T18:50:42.190 に答える
26

私にとってdebug_backtraceは、メモリの制限に達していたので、これを本番環境で使用して、エラーが発生したときにログに記録して電子メールで送信したいと考えていました。

代わりに、見事に機能するこのソリューションを見つけました!

// 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}"
于 2014-02-27T10:53:15.377 に答える
13

「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();

?>

man()は、get_caller()を呼び出すwoman()を呼び出します。get_caller()は、誰がそれを呼び出したかをまだ知りません。なぜなら、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.
于 2011-01-22T12:17:15.703 に答える
12

呼び出しクラス/メソッドをリストするだけの何かが必要でした(Magentoプロジェクトで作業しています)。

大量の有用な情報をdebug_backtrace提供しますが、Magento のインストールのために吐き出す情報の量は圧倒的でした (82,000 行以上!)。呼び出し関数クラスだけに関心があったため、次の小さな解決策を考え出しました。

$callers = debug_backtrace();
foreach( $callers as $call ) {
    echo "<br>" . $call['class'] . '->' . $call['function'];
}
于 2013-06-20T18:07:59.313 に答える
5

親関数名を取得する最も簡単な方法は次のとおりです。

$caller = next(debug_backtrace())['function'];
于 2014-05-23T11:15:54.090 に答える
1

私が見たその質問の最良の答えは次のとおりです。

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

短くてきれい

于 2012-12-11T10:15:43.443 に答える