Obtenir le nom de la fonction appelante en PHP?


135

Existe-t-il une fonction PHP pour connaître le nom de la fonction appelante dans une fonction donnée?


Vous devez utiliser Xdebug. Voir ma réponse dans cet article: stackoverflow.com/questions/1513069/…
svassr

13
Xdebug n'est catégoriquement pas seulement une fonction PHP, qui était la requête d'origine. Si vous souhaitez par exemple utiliser le nom de la fonction appelante dans une logique PHP ultérieure et ne pas installer XDebug sur des serveurs de production, vous avez besoin d'une fonction PHP.
JP

Réponses:


198

Voir debug_backtrace - cela peut tracer votre pile d'appels jusqu'en haut.

Voici comment attirer votre interlocuteur:

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

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

59
Il me semble que cela imprime le nom de la fonction appelée. Utilisez list(, $caller) = debug_backtrace(false);pour obtenir l'appelant, falsepour la performance ;-) (php5.3)
Znarkus

De nombreuses solutions vues sur le Web obtiennent le deuxième élément du tableau backtrace pour obtenir l'appelant de l'instance: pouvons-nous en être si sûrs? Le deuxième élément est-il toujours celui que nous recherchons? Je pensais qu'un __construct () qui inclut à l'intérieur un autre appel tel que parent :: __ construct () pourrait déplacer d'une autre position l'appelant réel (n'a pas encore essayé).
Emanuele Del Grande

1
J'ai essayé de vérifier l'ordre des appelants renvoyés lors de l'utilisation d'une ReflectionClass, et cela change évidemment la position de la méthode de l'appelant "réel", qui est visible dans l'interface utilisateur, donc aucune hypothèse sur la position de la trace arrière ne peut être faite.
Emanuele Del Grande

4
array shift supprimera le premier élément et retournera l'élément supprimé. Le tableau d'origine sera modifié et cela devrait donner le résultat souhaitéecho 'called by '.$trace[0]['function']
GoodSp33d

21
debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2)[1]['function'];pour obtenir le nom de l'appelant avec une meilleure performance.
ahuigo

17

Xdebug fournit quelques fonctions intéressantes.

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

retournera trace

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

Pour installer Xdebug sur ubuntu, le meilleur moyen est

sudo aptitude install php5-xdebug

Vous devrez peut-être d'abord installer php5-dev

sudo aptitude install php5-dev

Plus d'informations


15

C'est très tard mais je voudrais partager la fonction qui donnera le nom de la fonction à partir de laquelle la fonction courante est appelée.

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

J'espère que cela sera utile.


1
Vous êtes le bienvenu David !!! J'utilise également ceci à des fins de débogage dans mon projet :)
MANISH ZOPE

Le mode "trace complète" est très utile. Merci d'avoir partagé.
Leopoldo Sanczyk

15

debug_backtrace() fournit des détails sur les paramètres, les appels de fonction / méthode dans la pile d'appels actuelle.


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

Fonctionne depuis PHP 5.4 .

Ou optimisé (par exemple pour les cas d'utilisation sans débogage):

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

Le premier argument empêche de remplir les arguments de fonction inutilisés, le second limite la trace à deux niveaux (nous avons besoin du second).


7

J'ai fait ceci et je l'ai utilisé moi-même

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

Je voulais juste dire que la méthode de flori ne fonctionnera pas en tant que fonction car elle retournera toujours le nom de la fonction appelée au lieu de l'appelant, mais je n'ai pas la réputation de commenter. J'ai créé une fonction très simple basée sur la réponse de flori qui fonctionne bien pour mon cas:

class basicFunctions{

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

}

EXEMPLE:

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

Cela devrait fonctionner:

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

0

Cela le fera bien:


// 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()
**/```
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.