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");
Nadzieja pomaga kogoś. Jeśli rzeczywista funkcja jest poza skryptami httpdocs, nie można jej znaleźć, ponieważ serwer zostanie skonfigurowany, aby nie zezwalać na to. Przetestowałem go tylko w jednym folderze, 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żesz ją ponownie opublikować.
To zdecydowanie robi to, co chcesz. Ale uważaj, 'debug_backtrace()' jest kosztownym połączeniem. Nie miej zwyczaju używać go do określania łańcuchów wywołań. Jeśli chcesz "chronić" te funkcje, sprawdź OOP i metody chronione. – ircmaxell
bardzo dziękuję wszystkim! –