Folgender kleiner Herlfer ist von DSB und mir geschrieben worden.
Gerade wenn man grössere Projekte bearbeitet, viele Includedateien hat,
verliert man schon mal leicht den Überblick.
Das folgende Script untersucht ab dem vorgegebenen Verzeichnis alle Dateien und extrahiert die Funktionen mit Namen , Parametern, Datei und Zeilennummern.
Es ist nicht umfassend, so kann man nicht die Ergebnisse sortieren, etc., aber man kann es leicht den eigenen Bedürfnissen anpassen.
Auch ist es nicht perfekt - es kann noch nicht zwischen Javascript und PHP unterscheiden, aber als Orientierungshilfe setzt ich es häufig ein.
Auch um fremde Projekte zu analysieren ist es sehr nützlich.
Enthalten ist auch eine nützliche Array-Sortier-Routine. Sie ermöglicht die Sortierung eines beliebigen Arrays mit Angabe des Sortierfeldes.
Viel Spass damit.
Name: func.php
PHP-Code:
<?php
$func_found=ARRAY(); // nimmt die gefunden Funktionen auf
$class_found=ARRAY(); //nimmt die Klassen auf
$startdir=(isset($_POST['startdir'])) ? $_POST['startdir'] : "";
if($startdir!="" && substr($startdir,-1)!="/") $startdir.="/";
?>
<h2>PHP Projekt-Analyse</h2>
<form action="func.php" method="post">
Startverzeichnis: <input type="Text" name="startdir" value="<?php echo $startdir;?>">
<input type="submit" name="submit" value=" Analyse Start ">
</form><hr>
<?php
if(isset($_POST["submit"])) {
if($startdir=="") exit;
echo "<h3>Analysiere Verzeichnis '$startdir'</h3>";
GetDirArray($startdir); // holt alle Dateien in das Array $dir
$summe_zeilen=0; // enthält die Anzahl der Codezeilen
$leerzeilen=0; // enthält die Anzahl der Leer- und Kommentarzeilen
// Ausgabe von $dir
for($i=0;$i<count($dir);$i++)
{
$teil=explode(".",$dir[$i]);
$letzter=sizeof($teil);
$endung=strtolower($teil[$letzter-1]);
$durchsuchen=ARRAY('php','php3','php4','php5','html','htm','xml');
if (in_array($endung,$durchsuchen))
{
get_functions($dir[$i]);
}
}
$func_found=mu_sort($func_found,"aufruf");
$anzahl=sizeof($func_found);
// Ergebnisausgabe
echo '<b><u>Analyse:</u></b><br>';
echo 'Es wurden <b>'.number_format($summe_zeilen,0,",",".").'</b> Zeilen Code durchsucht.';
echo '<br>Es wurden <b>'.number_format($anzahl,0,",",".").'</b> Funktionen gefunden.<br><br>';
echo '<br><b>'.number_format($leerzeilen,0,",",".").'</b> Leerzeilen oder Kommentare wurden übersprungen ';
echo "<table width=\"100%\" border=\"0\" cellpadding=\"0\" cellspacing=\"2\">";
echo "<tr><td><b>Nr.</b></td><td><b>Funktionsname</b></td><td><b>Parameter</b></td><td><b>Filename</b></td><td><b>Zeilennummer</b></td></tr>";
for ($i=0;$i<$anzahl;$i++)
{
echo "<tr";
if ($i % 2) echo " bgcolor=#dddddd";
else echo " bgcolor=white";
echo "><td>".($i+1)."</td><td>".$func_found[$i]['aufruf'];
echo "</td><td>".$func_found[$i]['parameter']."</td>";
echo "<td>".$func_found[$i]['file']."</td>";
echo "<td>".$func_found[$i]['zeile']."</td></tr>";
}
echo "</table>";
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function GetDirArray($sPath)
{
global $dir; // ARRAY $DIR MUSS GLOBAL SEIN
$handle=opendir($sPath);
while ($file = readdir($handle))
{
$retVal[count($retVal)] = $file;
}
//Clean up and sort
closedir($handle);
sort($retVal);
while (list($key, $val) = each($retVal))
{
if ($val != "." && $val != "..")
{
$path = str_replace("//","/",$sPath.$val);
$dir[] = $path; // SPEICHERUNG IM ARRAY $DIR
if (is_dir($sPath.$val))
{
GetDirArray($sPath.$val."/");
}
}
}
}
function get_functions($filename)
{
global $func_found,$summe_zeilen,$leerzeilen,$startdir;
$satz=@file($filename);
$zeilen=sizeof($satz);
for ($i=0;$i<$zeilen;$i++)
{
$satz[$i]=trim($satz[$i]);
if ( ($satz[$i]>"") && (substr($satz[$i],0,1)!="#") )
{
$summe_zeilen++;
$index=sizeof($func_found);
if(strpos(strtolower($satz[$i]),"<script")) $js=true;
if(strpos(strtolower($satz[$i]),"</script>")) $js=false;
if (strtolower(substr($satz[$i],0,8))=="function")
{
$satz[$i]=substr($satz[$i],0,strrpos($satz[$i],")")+1);
$func_found[$index]['aufruf']=substr($satz[$i],8,strpos($satz[$i],"(")-8);
$func_found[$index]['parameter']=substr($satz[$i],strpos($satz[$i],"("));
str_replace(")","",$func_found[$index]['parameter']);
$func_found[$index]['file']=substr($filename,strlen($startdir));
$func_found[$index]['zeile']=$i+1;
}
if(strpos($satz[$i],"class=")) //Klassen sammeln
{
}
}
else $leerzeilen++;
}
}
function mu_sort ($array, $key_sort)
{
$key_sorta = explode(",", $key_sort);
$keys = array_keys($array[0]);
// sets the $key_sort vars to the first
for($m=0; $m < count($key_sorta); $m++) { $nkeys[$m] = trim($key_sorta[$m]); }
$n += count($key_sorta); // counter used inside loop
// this loop is used for gathering the rest of the
// key's up and putting them into the $nkeys array
for($i=0; $i < count($keys); $i++)
{
// quick check to see if key is already used.
if(!in_array($keys[$i], $key_sorta))
{
// set the key into $nkeys array
$nkeys[$n] = $keys[$i];
$n += "1";
}
}
// this loop is used to group the first array [$array]
// into it's usual clumps
for($u=0;$u<count($array); $u++)
{
// set array into var, for easier access.
$arr = $array[$u];
// this loop is used for setting all the new keys
// and values into the new order
for ($s=0; $s<count($nkeys); $s++)
{
// set key from $nkeys into $k to be passed into multidimensional array
$k = $nkeys[$s];
// sets up new multidimensional array with new key ordering
$output[$u][$k] = $array[$u][$k];
}
}
// wenn die Sortierung nicht ab- sondern aufsteigend sein soll, muss sort() benutzt werden
sort($output); // Sort=Aufsteigend -> oder rsort=absteigend
return $output;
}
?>