Hi!
(nach http://de2.php.net/manual/de/function.fwrite.php) Hier wird genau von dieser if-Bedingung ebenfalls eine Datei angelegt,
nein. Das mach ggfs. fopen().Öhm ... in dem Handbuchbeispiel ist aber fopen() auch mit einer solchen "Verneinung" belegt, du zitierst es ja selbst:
Ja. Damit der Ausdruck den if auswertet nur dann TRUE ergibt, wenn von fopen() FALSE zurückgegeben wird. Und nur wenn der Ausdruck TRUE ergibt, werden die Anweisungen unter if ausgeführt, das heißt Fehler ausgegeben.
if (!$handle = fopen($filename, "a")) {
print "Kann die Datei $filename nicht öffnen";
exit;
}
Jedenfalls wertet "if" ja den Ausdruck zwischen () von rechts nach links ausRichtig, daran denke ich manchmal nicht. Aber irgendwie reicht mir das nicht als Erklärung. Sorry, ich kann das nicht wesentlich genauer erklären bzw. als Frage formulieren.
Also, wenn da sowas steht wie
if (!$handle = fopen($filename, "a"))
dann passiert folgendes:
1. wird fopen() aufgerufen, das heißt die Datei wird in diesem Moment versucht zu öffnen
2. wird der Rückgabewert von fopen() der Variable $handle zugewiesen.
3. wird der Wert des Ausdrucks (!$handle) geprüft. Hier wird verzweigt (durch ! genau anders herum als normalerweise):
-> ist der Wert von $handle TRUE (oder wird er bei einer automatischen Konvertierung zu TRUE), dann wird die folgende Anweisung übersprungen (denn !TRUE == FALSE).
-> ist der Wert von $handle FALSE, dann werden die Anweisungen ausgeführt, die auf if folgen (denn !FALSE == TRUE).
In diesem Fall gibt fopen() entweder eine gültige Resource zurück (die Datei wurde in diesem Moment geöffnet), das heißt das Öffnen hat funktioniert, oder eben FALSE, das heißt dass ein Fehler aufgetreten ist. Dieser Rückgabewert wird $handle zugewiesen (wenn fopen() funktioniert hat, enthält $handle also direkt die Verknüpfung mit der Resource). Dann wird der Ausdruck (!$handle) ausgewertet, halt ob TRUE oder FALSE. Wenn $handle eine Resource enthält, wird es gemäß http://de3.php.net/manual/de/language.types.boolean.php#language.types.boolean.casting in TRUE konvertiert, durch ! gibt der gesamte Ausdruck also FALSE zurück -> folgende Anweisung wird übersprungen.
Wenn fopen() dagegen FALSE zurück gibt (Fehler...), dann hat $handle den Wert FALSE, wodurch der Ausdruck (!$handle) zu TRUE wird -> die if-Bedingung ist erfüllt -> folgende Anweisung ausführen.
Naja, ist echt blöd zu erklären ;-)
Ich hoffe Du verstehst es trotzdem.
Grüße
Andreas
SELFHTML Linkverzeichnis: http://aktuell.de.selfhtml.org/links/