Da sag ich doch mal Prost auf die meisten Entwicklungsumgebungen
Die machen das meist automatisch
Gruss
Jan
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;
}
?>
Geändert von steffenk (08.03.2005 um 23:21 Uhr)
TYPO3 · MySQLDumper · dislabs
·
manche Mühlen mahlen schneller ...
"Ich habe Rücken"
Horst Schlämmer
Da sag ich doch mal Prost auf die meisten Entwicklungsumgebungen
Die machen das meist automatisch
Gruss
Jan
na wer es hat, der brauchts halt nicht
jeder nimmt so seine Werkzeuge die er liebt
probiers doch mal aus - und dann sag mir, welches Programm das so auflistet
TYPO3 · MySQLDumper · dislabs
·
manche Mühlen mahlen schneller ...
"Ich habe Rücken"
Horst Schlämmer
Also ich nutze die Routine auch um mir eine schöne Funktionesreferenzliste auszudrucken. Wie häufig weiß man nicht mehr genau in welcher Reihenfolge die Parameter der Funktion angegeben werden musste. Da genügt ein Blick und alles ist klar. Und ich halte auch gern Papier in den Händen.![]()
Kleiner Nachtrag: man kann auch mehrere Keys als Suchkriterium nacheinander benutzen (wie bei MySQl ORDER BY). Die Schlüssel werden einfach durch Komma getrennt.Zitat von St@eff.en
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)