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?

miken32
la source
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']}";
Paul Dixon
la source
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

svassr
la source
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.

MANISH ZOPE
la source
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.

CMS
la source
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).

flori
la source
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;
    }   
}
Paul Gobée
la source
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..
}
lrd
la source
2

Vous pouvez extraire ces informations du tableau retourné par debug_backtrace

Richard Turner
la source
2

Celui-ci a fonctionné le mieux pour moi: var_dump(debug_backtrace());

Gershon Herczeg
la source
1

Cela devrait fonctionner:

$caller = next(debug_backtrace())['function'];
Kenorb
la source
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()
**/```
Uriahs Victor
la source