PHP Static Variable auf NULL setzen

[grueni]

Lt. Commander
Registriert
Okt. 2008
Beiträge
1.293
Hallo :)

Ich arbeite grad an einem Backup Manager mit MySQL Anbindung.
Ich zähle in einem Verzeichnis die Anzahl der Datein, der Ordner, die Größe des Verzeichnisses und liste die einzelnen Datein auf.
In meiner "GUI" kann ich 1 oder mehrere Dateipfade eingeben die "gescannt" werden sollen.

Die Funktion klappt prima, allerdings wenn ich 2 Verzeichnisse in einer Schleife nacheinander Scanne addieren sich alle Werte jeweils um die Anzahl des n. Verzeichnisses.
Also wenn in dir_1 5 Dateien liegen und in dir_2 10 dann ist die Ausgabe, dass in dir_2 15 Dateien liegen, da die Variablen als static deklariert sind in meiner Funktion, da innerhalb der Funktion die Funktion wieder aufgerufen wird um tiefer in Ordnern zu scannen.

Da ich in PHP nicht so sehr mit OOP vertraut bin, gibt es einen Möglichkeit die Variablen in der Funktion wieder auf NULL zu setzten für den n. Aufruf ?

Anbei mal ein wenig Code (Die Funktion wurde teilweise so aus dem Netz übernommen und an meine Bedürfnisse angepasst):

Code:
function dirCount($dirName) {
	static $i;
	static $z;
	static $sum;
	static $list;
	$dir = dir($dirName);
		while($obj = $dir->read()) {
			if($obj!='.' && $obj!='..') {
			
				if(is_dir($dirName.'/'.$obj)) {
					dirCount($dirName.'/'.$obj);
					$z++;
					
				} else {
					$list[] = "$dirName\\$obj";
					$sum += sprintf("%u", filesize($dirName.'/'.$obj)); 
					$i++;
				}
			}
		}
	return $arr=array($z,$i,$sum,$list);
}

Diese Funktion ruf ich in einer Schleife auf:

Code:
*$link: Einzelnen Pfade zu Verzeichnissen (zB: C:\ und D:\)

while ($i < count($link)) {
	$arr = dirCount("$link[$i]");
	echo $arr[0] . '<br>';
	echo $arr[1] . '<br>';
	echo $arr[2] . '<br>';
$i++;
}

Wie gesagt, bei den Ausgaben würde nun für Verzeichnis 1 die korrekte Summe ausgegeben von Dateien,Ordnern und Größe, für Verzeichnis 2 und ff. würde dann zB. die Summe von Verzeichnis1 + die Summe von Verzeichnis 2 ausgegeben (Dateien).

Wenn ich die Variablen in der Funktion nicht statisch mache, dann zählt er die Dateien nur in erster Stufe um Ordner, also nicht die Dateien die Ebenen darunter liegen.

Kann mir jemand einen Tipp geben :) ?
Danke:evillol:
 
Bah ist das schon wieder hässlicher Code.

Aber zum Thema: Mit OOP hat das nichts zu tun.

Entferne die statischen Variablen und übergib stattdessen ihre Werte beim rekursiven Aufruf. Dadurch kann die Funktion (in der Rekursion) dann weiterzählen.

Das Prinzip von Akkumulatoren wurde in diesem Thread schon ausgiebig erläutert. Da geht es auch um Dateien und Ordner. Dass da Python verwendet wird, ist Nebensache, da das Prinzip immer das gleiche ist.
 
Zuletzt bearbeitet:
Doh ! Darauf hätte ich auch kommen können, die Variablen an die Funktion zu übergeben :rolleyes:
Danke ;)

Und nochmal zum Thema hässlicher Code:D Die Hauptsache ist doch das es läuft oder nicht, klar muss man bei prof. Anwendungen Rechenzeit und Laufzeit beachten, aber da die im Heimbereich oftmals zu vernachlässigen ist...
Will damit ja nicht meine Brötchen verdienen :freaky:


edit: Öhm naja das bringt allerdings auch nichts wenn ich die in die Funktion mit übergebe, weil dann eben wieder das Ergebnis falsch ist, da er die tieferen Ordnerstrukturen nicht richtig ausliest :(

Gibt es da noch eine andere alternative ?
 
Zuletzt bearbeitet:
[grueni] schrieb:
Und nochmal zum Thema hässlicher Code:D Die Hauptsache ist doch das es läuft oder nicht
Dein Code läuft aber nicht. :P

Du könntest dir, ganz im Sinne der Rekursion, den Rückgabewert der Methode anschauen, die du in Zeile 11 aufrufst.
Die Alternative wäre, dein Array per Referenz zu übergeben.
 
[grueni] schrieb:
Und nochmal zum Thema hässlicher Code:D Die Hauptsache ist doch das es läuft oder nicht, klar muss man bei prof. Anwendungen Rechenzeit und Laufzeit beachten, aber da die im Heimbereich oftmals zu vernachlässigen ist...

Geht nicht nur im Geschwindigkeit. Unleserlicher Code kann nicht gut weiterentwickelt werden.
 
Ja das stimmt wohl, allerdings sagte ich ja, ist ja alles privat nur für mich, ihr habt alle vollkommen recht wenn es um irgendwas geht was mehrere entwickeln oder produktiv irgendwo anders eingesetzt werden soll ;)
 
Gab mal bei Stackoverfow ein Thread mit den "besten" Kommentaren im Sourcecode. Einer ging etwa so: "Als ich den Code schrieb, wussten nur Gott und ich wie das funktionierte. Heute weiß es nur noch Gott." ;)
 
Hm, das kenn ich aber auch. Viele Probleme hab ich nachts um 3 nach n paar Cuba Libre gelöst. Ich weiß heute nicht mehr, wie ichs gemacht hab, aber die Seite läuft noch.
 
Zurück
Oben