2010-06-02 12 views

Antwort

21

Verwendung debug_backtrace():

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

    // Here, $backtrace[0] points to fail(), so we'll look in $backtrace[1] instead 
    if (isset($backtrace[1]['function']) && $backtrace[1]['function'] == 'epic') 
    { 
     // Called by epic()... 
    } 
} 
+7

Das tut definitiv, was Sie wollen. Aber Vorsicht 'debug_backtrace()' ist ein teurer Anruf. Machen Sie sich nicht daran gewöhnt, Call-Ketten zu bestimmen. Wenn Sie diese Funktionen "schützen" möchten, überprüfen Sie OOP und geschützte Methoden. – ircmaxell

+0

vielen Dank an euch alle! –

107

können Sie debug_backtrace() verwenden.

Beispiel:

<?php 

function epic($a, $b) 
{ 
    fail($a . ' ' . $b); 
} 

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

    print_r($backtrace); 
} 

epic('Hello', 'World'); 

Ausgang:

Array 
(
    [0] => Array 
     (
      [file] => /Users/romac/Desktop/test.php 
      [line] => 5 
      [function] => fail 
      [args] => Array 
       (
        [0] => Hello World 
       ) 

     ) 

    [1] => Array 
     (
      [file] => /Users/romac/Desktop/test.php 
      [line] => 15 
      [function] => epic 
      [args] => Array 
       (
        [0] => Hello 
        [1] => World 
       ) 

     ) 

) 
+2

Zum ersten Mal fand ich 'debug_backtrace()' was für eine hervorragende Funktion. Ich werde diesen benutzen! –

-1
function findFunction($function, $inputDirectory=""){ 
    //version 0.1 
    $docRoot = getenv("DOCUMENT_ROOT"); 
    $folderArray = null; 
    $dirArray = null; 

    // open directory 
    $directory = opendir($docRoot.$inputDirectory); 

    // get each entry 
    while($entryName = readdir($directory)) { 
     if(is_dir($entryName) && $entryName != "." && $entryName != ".."){ 
      $folderArray[] = str_replace($inputDirectory, "", $entryName); 
     } 
     $ext = explode(".", $entryName); 
     if(!empty($ext[1])){ 
      $dirArray[] = $docRoot.$inputDirectory."/".$entryName; 
     } 
    } 

    // close directory 
    closedir($directory); 
    $found = false; 

    if(is_array($dirArray)){ 
     foreach($dirArray as $current){ 
      $myFile = file_get_contents($current); 
      $myFile = str_replace("<?php", "", $myFile); 
      $myFile = str_replace("?>", "", $myFile); 
      if(preg_match("/function ".$function."/", $myFile)){ 
       $found = true; 
       $foundLocation = $current; 
       break; 
      } 
     } 
    } 
    if($found){ 
     echo $foundLocation; 
     exit; 
    } else if(is_array($folderArray)){ 
     foreach($folderArray as $folder){ 
      if(!isset($return)){ 
       $return = findFunction($function, $inputDirectory."/".$folder); 
      } else if($return == false){ 
       $return = findFunction($function, $inputDirectory."/".$folder); 
      } 
     } 
    } else { 
     return false; 
    } 
} 

findFunction("testFunction", "rootDirectory"); 

Hoffe, dass es jemand hilft. Wenn die eigentliche Funktion außerhalb von httpdocs liegt, kann sie nicht gefunden werden, da der Server so eingerichtet wird, dass er nicht erlaubt wird. Testen Sie es nur einen Ordner tief, aber die rekursive Methodik sollte in der Theorie funktionieren.

Dies ist wie Version 0.1, aber ich habe nicht vor, die Entwicklung weiter so, wenn jemand es aktualisiert, fühlen Sie sich frei, es erneut zu veröffentlichen.

+0

Zu viel Arbeit: füge dies zu .bashrc 'function ff() hinzu { grep" function $ 1 "$ (find ./ -name" * .php ") } dann nenne' ff fail' oder 'ff epic '. siehe: https: // github.com/MaerF0x0/VimSetup/blob/master/bashrC# L122 –

12

Also, wenn Sie wirklich noch nicht wissen, wie, als hier Lösung:

$backtrace = debug_backtrace(); 
echo 'Mu name is '.$backtrace[1]['function'].', and I have called him! Muahahah!'; 
+1

So könnten Sie verwenden, wenn ($ backtrace [1] ['Funktion'] == 'epic') {// ein paar Sachen; sonst tu etwas anderes; } ?? wow –

+1

Ja, aber nicht! Jedenfalls nicht im permanenten Anwendungscode. Verwenden Sie Parameter. debug_backtrace() sieht wie eine ziemlich schwere Operation aus. – Kluny

2

Code unten versuchen.

foreach(debug_backtrace() as $t) {    
    echo $t['file'] . ' line ' . $t['line'] . ' calls ' . $t['function'] . "()<br/>"; 
} 
9

schnellste und einfachste Lösung, wie ich

public function func() { //function whose call file you want to find 
    $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 1); 
} 

$trace: Array 
(
    [0] => Array 
     (
      [file] => C:\wamp\www\index.php 
      [line] => 56 
      [function] => func 
      [class] => (func Class namespace) 
      [type] => -> 
     ) 

) 

ich testen Sie die Geschwindigkeit auf Lenovo Laptop gefunden: Intel Pentiom CPU N3530 2,16 GHz, RAM 8GB

global $times; 
$start = microtime(true); 
$trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 1); 
$times[] = microtime(true) - $start; 

Ergebnisse:

count($times): 97 
min: 2.6941299438477E-5 
max: 10.68115234375E-5 
avg: 3.3095939872191E-5 
median: 3.0517578125E-5 
sum: 321.03061676025E-5 

the same results with notation without E-5 
count($times): 97 
min: 0.000026941299438477 
max: 0.0001068115234375 
avg: 0.000033095939872191 
median: 0.000030517578125 
sum: 0.3061676025 
+0

Für mich war DEBUG_BACKTRACE_IGNORE_ARGS sehr nützlich, ohne es gab es viel zu viele Infos. – Arie

0

Wenn Sie möchten, Trac e die genaue Herkunft des Anrufs an der Spitze des Stapels Sie den folgenden Code verwenden:

$call_origin = end(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS)); 

Dies wird angekettet Funktionen ignorieren und nur die wichtigsten Anruf info (relevant ist lose verwendet erhalten, wie es hängt, was Ihre versuchen zu erreichen).