2009-04-13 2 views
5

aufgerufen wurde wissen Sie, wie kann ich feststellen, aus welcher Datei wurde eine Funktion innerhalb dieser Funktion aufgerufen?Ermitteln, wo eine Funktion mit PHP

Ich dachte an debug_backtrace mit .. aber das sieht nicht wie eine elegante Art und Weise, es zu tun, und sie enumarate auch aus anderen Gründen in einer anderen Frage here

Also, was andere Alternativen gibt es?

Dank viel

+0

Warum müssen Sie wissen, von wo aus die aktuelle Funktion aufgerufen wurde? Wie die verknüpfte Frage besagt, sollten Sie Ihr Design überdenken, wenn Ihre Funktionen wirklich wissen müssen, wer sie angerufen hat. – Gumbo

+0

ich habe eine Ansicht Klasse und möchte nicht den gesamten Pfad der Ansicht angeben ... sondern nur den Namen und die zu der Ansicht führen, die sich im selben Verzeichnis wie die Ansicht befindet, die die Klasse aufgerufen hat. –

+0

Es klingt, als ob Sie dabei sind, Ihren Fuß abzuschießen. Tu das nicht. – troelskn

Antwort

2

Von der Funktion debug_backtrace() ist die einzige Möglichkeit, den Aufrufer zu bestimmen, es sei denn, Sie übergeben diese Informationen als Parameter.

Beachten Sie, dass Sie nicht verwenden können Standardwerte verwenden, um dies zu tun. Z.B .:

function f($param1, $param2, $caller=__FUNCTION__) ... 

__FUNCTION__ wird zur Analysezeit ausgewertet werden, so dass es immer den gleichen Wert haben wird. Die Funktion, in der der Gültigkeitsbereich f deklariert ist.

3

Ich lieh mir diese vor einiger Zeit Code von irgendwo und es wirkt wie ein Zauber debug_backtrace() verwenden. Ich hoffe, Sie finden es nützlich:

function backtrace(){ 
    $backtrace = debug_backtrace(); 

    $output = ''; 
    foreach ($backtrace as $bt) { 
     $args = ''; 
     foreach ($bt['args'] as $a) { 
      if (!empty($args)) { 
       $args .= ', '; 
      } 
      switch (gettype($a)) { 
       case 'integer': 
       case 'double': 
        $args .= $a; 
        break; 
       case 'string': 
        //$a = htmlspecialchars(substr(, 0, 64)).((strlen($a) > 64) ? '...' : ''); 
        $args .= "\"$a\""; 
        break; 
       case 'array': 
        $args .= 'Array('.count($a).')'; 
        break; 
       case 'object': 
        $args .= 'Object('.get_class($a).')'; 
        break; 
       case 'resource': 
        $args .= 'Resource('.strstr($a, '#').')'; 
        break; 
       case 'boolean': 
        $args .= $a ? 'TRUE' : 'FALSE'; 
        break; 
       case 'NULL': 
        $args .= 'Null'; 
        break; 
       default: 
        $args .= 'Unknown'; 
      } 
     } 
     $output .= '<br />'; 
     $output .= '<b>file:</b> '[email protected]$bt['file'].' - line '[email protected]$bt['line'].'<br />'; 
     $output .= '<b>call:</b> '[email protected]$bt['class'][email protected]$bt['type'][email protected]$bt['function'].'('.$args.')<br />'; 
    } 
    return $output; 
} 
+0

Ich suche nach einer Alternative für die Verwendung der Funktion debug_backtrace. –

+1

Dann glaube ich, dass Sie Ihre Frage neu formulieren sollten, da ich wusste, dass Ihr Problem war, dass debug_backtrace seine Ausgabe hässlich präsentiert. Wie auch immer, ich glaube nicht, dass es eine einfache Alternative zu debug_backtrace gibt ... – Seb

1

Sie werden nicht viele Optionen haben. Die andere Option (die in der anderen Frage gestellt wurde), um den Anrufer zu zwingen, es Informationen mit dem Funktionsaufruf (mit PHP magischen Konstanten) provde:

callFunction(1, 2, 3, __FUNCTION__) 
callFunction(1, 2, 3, __CLASS__, __METHOD__) 
callFunction(1, 2, 3, $this, __METHOD__) 

    or 

$class = new ReflectionClass(__CLASS__); 
$method = $class->getMethod(__METHOD__); 
callFunction(1, 2, 3, $method) // $method would be a ReflectionMethod obj 

eine mögliche Alternative wäre. Aber es ist

  • Verschleiern Code
  • können „manipuliert“ werden, die den Code von callFunction verursachen könnten scheitern, und es wäre sehr schwierig sein, diese Fehler aufzuspüren.

Wenn ich an deiner Stelle wäre, würde ich versuchen, es in einer Funktion zu vermeiden, die im gesamten Code verwendet wird. Verwenden Sie debug_backtrace (auch wenn es "langsam" sein könnte). Lesbarer Code gewinnt schneller Code.

0

Wenn dies für Debugging-Zwecke ist, können Sie eine Ausnahme auslösen und den Funktionsaufruf-Stack drucken, wo Sie es fangen.

3

Die Antworten hier von der Mickey-Maus-Crew sind typisch für die Online-PHP-Community! Anstatt die Antwort zu teilen, fragen sie dich, warum du sie vielleicht brauchst. Es macht nichts, dass Solomongaby eine gültige Frage stellt und es ist eine normale Funktion in Standard-IDEs und professionellen Sprachen wie Java und Objective-C.

Solomongaby, ist dies der einfachste Weg, die Sie zu bekommen, was Sie brauchen:

$bt = debug_backtrace(); 
$end = end($bt); 
var_dump($end['class']); //or var_dump($end['file']); 
Verwandte Themen