Dennis K.: Problem mit ! oder ==false

Hello!

ich habe mal ein bescheidene frage weil ich das einfach nicht verstehe.
fopen liefert doch false zurück wenn ein fehler aufgetreten ist.
also kann man das ja testen:

  
if(!$stream=fopen($datei,"a"))  
 {  
    echo "Fehler";  
 }  
 else  
 {  
fwrite($stream,"\n Das ist ein test");  
fclose($stream);  
 }  

So prüfe ich ja ob der ergebniss ungleich True also False ist.
Nun habe ich es mal so geschrieben:

  
if($stream=fopen($datei,"a")==false)  
 {  
    echo "Fehler";  
 }  
 else  
 {  
fwrite($stream,"\n Das ist ein test");  
fclose($stream);  
 }  
 

Sollte doch eigentlich das gleiche sein oder?
Ich prüfe ob False ist wie oben.
Aber das klappt nicht, dann fängt komischerweise fwrite und fclose an zu meckern, wieso?

Danke für Hilfe :)

  1. Moin

    Bei mir gehen beide Schleifen ohne Probleme und ohne gemeckere von fwrite oder fclose!

    Gruß Bobby

    --
    -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <-
    -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <-
  2. Hallo,

    if(!$stream=fopen($datei,"a"))

    das ist völlig in Ordnung.

    if($stream=fopen($datei,"a")==false)

    Sollte doch eigentlich das gleiche sein oder?
    Ich prüfe ob False ist wie oben.
    Aber das klappt nicht, dann fängt komischerweise fwrite und fclose an zu meckern, wieso?

    Die Rangfolge der Operatoren spielt dir hier einen Streich. Der Vergleich (Operator ==) wird zuerst ausgeführt, dann erst die Zuweisung. Deine Anweisung wird also so interpretiert:

    * Führe fopen() aus und vergleiche das Ergebnis mit false
     * weise das boolsche Ergebnis dieses Vergleichs (also true,
       wenn fopen() false ergab, sonst false) der Variablen $stream zu

    Wenn du den expliziten Vergleich mit false haben willst (wozu eigentlich?), musst du Klammern setzen:

    if (($stream=fopen($datei,"a"))==false)

    So long,
     Martin

    --
    Paradox ist, wenn der Innenminister sich äußert und der Außenminister sich erinnert.
    1. Hi Martin,

      ahhhhh.... nu weiss ich bescheid!
      Also sollte man wenn es auf dieser art Prüft immer zusätlich in klammern setzten das zuerst die Anweisung und dann der Operator ausgeführt wird.
      Danke!

    2. echo $begrüßung;

      Wenn du den expliziten Vergleich mit false haben willst (wozu eigentlich?), musst du Klammern setzen:

      if (($stream=fopen($datei,"a"))==false)

      Oder das false ganz nach link. Außerdem empfiehlt es sich einen typsicheren Vergleich === zu verwenden, ansonsten schlägt einem auch noch PHPs automatische Typumwandlung ein Schnippchen, wenn reguläre Werte wie 0 auch als false interpretiert werden.

      if (false === $variable = Zuweisungsausdruck)

      Der explizite Vergleich mit false ist in Fällen wie strpos() nötig, wenn eine 0 als positives Ergebnis von einem false zu unterscheiden ist. Bei fopen() kann man sich das jedoch sparen, da die Funktion im Gutfall stets einen Wert zurückliefert, der nicht als false interpretiert werden kann.

      echo "$verabschiedung $name";

      1. Hey,

        das wird ja immer Interessanter!
        Gut zu wissen!

        1. n'abend,

          das wird ja immer Interessanter!

          Interessant wird das ganze, wenn man mit Funktionen zu tun hat, welche (beispielsweise) neben normalen Zahlen auch false zurückgeben können.

          Wie wir bereits wissen, wird 0 (und "0") nach false evaluiert, was uns im folgenden Beispiel um die Ohren fliegen könnte, würden wir das nicht wissen.
          ((automatische) Umwandlung nach boolean)

          strpos() ist solch eine Funktion.

          $pos_a = strpos( 'hallo welt', 'a' ); // gibt 1 aus - informatiker zählen ab 0 ;)  
          $pos_t = strpos( 'hallo welt', 't' ); // gibt 9 aus  
          $pos_h = strpos( 'hallo welt', 'h' ); // gibt 0 aus  
          $pos_f = strpos( 'hallo welt', 'f' ); // gibt false aus  
            
          if( $pos_f == $pos_h )  
            echo 'hier haben wir auch schon das Dilemma';  
            
          if( $pos_f === $pos_h )  
            echo 'hier haben wir das Dilemma durch einen typensicheren Vergleich verhindert';
          

          weiterhin schönen abend...

          --
          Freundlich wie man war, hat man mir Großbuchstaben geschenkt.
          sh:( fo:# ch:# rl:| br:> n4:& ie:{ mo:} va:) de:] zu:} fl:( ss:? ls:[ js:|
      2. n'abend,

        Der explizite Vergleich mit false ist in Fällen wie strpos() nötig, wenn eine 0 als positives Ergebnis von einem false zu unterscheiden ist. Bei fopen() kann man sich das jedoch sparen, da die Funktion im Gutfall stets einen Wert zurückliefert, der nicht als false interpretiert werden kann.

        genau. fopen() liefert (wie so viele andere "Ressourcenöffner") eine Ressource. Ressourcen werden von PHP immer nach true evaluiert.
        (nur, um das noch ausgeführt zu haben...)

        weiterhin schönen abend...

        --
        Freundlich wie man war, hat man mir Großbuchstaben geschenkt.
        sh:( fo:# ch:# rl:| br:> n4:& ie:{ mo:} va:) de:] zu:} fl:( ss:? ls:[ js:|