czy istnieje sposób, aby dowiedzieć się, skąd została wywołana funkcja w PHP? przykład:
function epic()
{
fail();
}
function fail()
{
//at this point, how do i know, that epic() has called this function?
}
php
function-calls
pol_b
źródło
źródło
debug_backtrace()
wspaniałą funkcję. Użyję tego!Zastosowanie
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()... } }
źródło
debug_backtrace()
to droga rozmowa. Nie używaj go do określania łańcuchów połączeń. Jeśli chcesz „zabezpieczyć” te funkcje, sprawdź OOP i metody chronione.Najszybsze i najprostsze rozwiązanie, jakie znalazłem
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] => -> ) )
Szybkość testuję na laptopie Lenovo: procesor Intel Pentiom N3530 2,16GHz, RAM 8GB
global $times; $start = microtime(true); $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 1); $times[] = microtime(true) - $start;
Wyniki:
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.0032103061676025
źródło
Więc jeśli nadal NAPRAWDĘ nie wiesz jak, to oto rozwiązanie:
$backtrace = debug_backtrace(); echo 'Mu name is '.$backtrace[1]['function'].', and I have called him! Muahahah!';
źródło
Użyj funkcji debug_backtrace: http://php.net/manual/en/function.debug-backtrace.php
źródło
Wypróbuj poniższy kod.
foreach(debug_backtrace() as $t) { echo $t['file'] . ' line ' . $t['line'] . ' calls ' . $t['function'] . "()<br/>"; }
źródło
Jeśli chcesz prześledzić dokładne pochodzenie wywołania na górze stosu, możesz użyć następującego kodu:
Spowoduje to zignorowanie połączonych funkcji i uzyskanie tylko najbardziej istotnych informacji o połączeniu (istotne jest używane luźno, ponieważ zależy to od tego, co próbujesz osiągnąć).
źródło
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");
Mam nadzieję, że to komuś pomoże. Jeśli rzeczywista funkcja znajduje się poza httpdocs, nie można jej znaleźć, ponieważ serwer zostanie skonfigurowany tak, aby na to nie zezwalać. Przetestowałem go tylko o jeden folder głęboko, ale metodologia rekurencyjna powinna działać w teorii.
To jest jak wersja 0.1, ale nie zamierzam kontynuować jej rozwoju, więc jeśli ktoś ją zaktualizuje, może ją ponownie opublikować.
źródło
function ff() { grep "function $1" $(find ./ -name "*.php") }
a następnie wywołajff fail
lubff epic
. patrz: github.com/MaerF0x0/VimSetup/blob/master/bashrc#L122