it-swarm.com.de

Name der Aufruferfunktion in PHP ermitteln?

Gibt es eine PHP Funktion, um den Namen der Aufruferfunktion in einer bestimmten Funktion herauszufinden?

123
phytovor

Siehe debug_backtrace - Dies kann Ihren Aufrufstapel bis ganz nach oben verfolgen.

So erreichen Sie Ihren Anrufer:

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

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

Xdebug bietet einige nette Funktionen.

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

wird Trace zurückgeben

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

Um Xdebug auf Ubuntu zu installieren, ist der beste Weg

Sudo aptitude install php5-xdebug

Möglicherweise müssen Sie zuerst php5-dev installieren

Sudo aptitude install php5-dev

mehr Info

16
svassr

debug_backtrace() liefert Details zu Parametern, Funktions-/Methodenaufrufen im aktuellen Aufrufstapel.

15
CMS

Dies ist sehr spät, aber ich möchte die Funktion teilen, die den Namen der Funktion angibt, von der aus die aktuelle Funktion aufgerufen wird.

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

Ich hoffe, das wird nützlich sein.

14
MANISH ZOPE
echo debug_backtrace()[1]['function'];

Funktioniert seit PHP 5.4 .

Oder optimiert (z. B. für Nicht-Debug-Anwendungsfälle):

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

Das erste Argument verhindert, dass nicht verwendete Funktionsargumente aufgefüllt werden, das zweite begrenzt den Trace auf zwei Ebenen (wir benötigen das zweite).

8
flori

Machte dies und benutze es selbst

/**
 * 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;
    }   
}
7
Paul Gobée

Ich wollte nur sagen, dass Floris Weg nicht als Funktion funktioniert, da er immer den aufgerufenen Funktionsnamen anstelle des Aufrufers zurückgibt, aber ich habe keinen Ruf für das Kommentieren. Ich habe eine sehr einfache Funktion basierend auf Floris Antwort erstellt, die für meinen Fall gut funktioniert:

class basicFunctions{

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

}

BEISPIEL:

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..
}
3
lrd

Sie können diese Informationen aus dem von debug_backtrace zurückgegebenen Array extrahieren

2
Richard Turner

Das sollte funktionieren:

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

Ich habe eine kleine Erweiterung für Zend_Log gemacht, jetzt zeigt sie Klasse/Methode/Zeile, von wo aus Logger aufgerufen wurde. Siehe hier http://mikebevz.com/2010/08/logger-with-caller-class-based-on-zend_log/

1
Mike Bevz

Dieser funktionierte am besten für mich: var_dump(debug_backtrace());

1
Gershon Herczeg

Eigentlich denke ich, dass debug_print_backtrace () das tut, was Sie brauchen. http://php.net/manual/en/function.debug-print-backtrace.php

1
vrijdenker