303 votes

Comment obtenir le nom de l'appel de fonction/méthode en PHP?

Je suis conscient de la fonction debug_backtrace, mais je suis à la recherche pour certains prêts à l'utilisation de la mise en œuvre de la fonction comme GetCallingMethodName()? Il serait parfait s'il a de la méthode de classe (si c'est en effet une méthode).

J'espère qu'il (ne pas le faire moi-même) veulent être pris comme normale la paresse, mais comme une bonne programmation de la paresse.

EDIT: Voici la réponse: http://stackoverflow.com/questions/190421/caller-function-in-php-5/190426#190426

688voto

diyism Points 1191

La plus simple:

$callers=debug_backtrace();
echo $callers[1]['function'];

173voto

Alix Axel Points 63455

L' debug_backtrace() de la fonction est la seule façon de savoir cela, si vous êtes paresseux, c'est une raison de plus vous devez le code de l' GetCallingMethodName() vous-même. Lutter contre la paresse! :D

39voto

Lucia Points 922

Vous pouvez également utiliser les informations fournies par une exception en php, c'est une solution élégante:


fonction GetCallingMethodName(){
 $e = new Exception();
 $trace = $e->getTrace();
 //la position 0 serait la ligne qui a appelé cette fonction, de manière à nous ignorer
 $last_call = $trace[1];
print_r($last_call);
}

fonction prn($a, $b){
 theCall($a, $b);
}

fonction theCall($a, $b){
GetCallingMethodName();
}

prn('lucie', 'php');

Et vous obtenez ce... (voilà!)

Tableau
(
 [fichier] => /home/lufigueroa/Desktop/test.php
 [ligne] => 12
 [fonction] => theCall
 [args] => Array
(
 [0] => lucie
 [1] => php
)

)

31voto

JustAnil Points 4635

Pour moi, debug_backtrace a été de frapper ma limite de mémoire, et je voulais l'utiliser dans la production de journaux et e-mail erreurs comme ils se produisent.

Au lieu de cela, j'ai trouvé cette solution qui fonctionne à merveille!

// 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}"

15voto

Aram Kocharyan Points 8530

J'ai juste écrit une version de ce qu'on appelle "get_caller", j'espère que cela aide. Le mien est assez paresseux. Il vous suffit d'exécuter get_caller() à partir d'une fonction, vous n'avez pas à spécifier comme ceci:

get_caller(__FUNCTION__);

Voici le script complet avec une étrange cas de test:

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

?>

l'homme() appelle la femme(), qui appelle get_caller(). get_caller() ne sait pas qui l'appelait encore, parce que la femme() a été prudent et ne pas dire que c', de sorte qu'il parcourt pour le savoir. Ensuite, il retourne qui appelait la femme(). Et l'impression du code-source en mode navigateur affiche la pile de fonction:

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X