Regenbogenjonny: Warum verlangt php hier einen expliziten Stringvergleich?

Hallo Forum,

ich habe hier folgende Methode:

    protected function doChecks() {
        if ($this->watermarkfile == "0") { ...

In $this->watermarkfile steht, wenn ich es per echo mal ausgeben lasse, vor der if-Abfrage der Pfad zum Wasserzeichen drin, somit wird nicht in die if-Bedingung hinein gesprungen, sondern in die anschließende else-Bedingung.

Wenn ich aber die Methode so notiere:

    protected function doChecks() {
        if ($this->watermarkfile == 0) { ...

Dann wird die if-Bedingung als "true" gewertet und das Script macht innerhalb der if-Bedingung weiter.

Das hätte ich nicht erwartet. Kann mir jemand erklären, warum das so ist? Ich hätte gedacht, dass mein Pfad (der ja in $this->watermarkfile drin steht, sowohl != "0", wie auch != 0 wäre.

Jonny

  1. Hallo Regenbogenjonny,

    Das hätte ich nicht erwartet. Kann mir jemand erklären, warum das so ist? Ich hätte gedacht, dass mein Pfad (der ja in $this->watermarkfile drin steht, sowohl != "0", wie auch != 0 wäre.

    Das ist das automatische Type-Juggling von PHP. Durch den Vergleich mit der 0 wird der String in eine Zahl umgewandelt; da das fehlschlägt ist das Ergebnis halt 0, und dann steht da 0 == 0.

    Um solche Fehler zu vermeiden ist es sinnvoll === zu verwenden anstatt ==.

    LG,
    CK

  2. Tach!

            if ($this->watermarkfile == "0") { ...
    

    In $this->watermarkfile steht, wenn ich es per echo mal ausgeben lasse, vor der if-Abfrage der Pfad zum Wasserzeichen drin, somit wird nicht in die if-Bedingung hinein gesprungen, sondern in die anschließende else-Bedingung.

    Hier findet ein Vergleich zweier Strings statt.

            if ($this->watermarkfile == 0) { ...
    

    Dann wird die if-Bedingung als "true" gewertet und das Script macht innerhalb der if-Bedingung weiter.

    Hier hast du einen String und eine Zahl. In dem Fall wird versucht, der String in eine Zahl zu konvertieren. Wenn da keine Zahl (am Anfang) drinsteht, ist das Ergebnis der Konvertierung 0. Damit ergibt der Vergleich true.

    Das hätte ich nicht erwartet. Kann mir jemand erklären, warum das so ist? Ich hätte gedacht, dass mein Pfad (der ja in $this->watermarkfile drin steht, sowohl != "0", wie auch != 0 wäre.

    Siehe auch PHP type comparision table.

    Warum aber vergleichst du mit der Zahl 0 (egal ob String oder Zahl), wenn du da gar keine 0 erwartest? Es gäbe da beispielsweise null für einen nicht vorhandenen Wert.

    dedlfix.

    1. Hallo Christian, hallo dedlfix,

      danke für Eure Antworten, wie gesagt, der Fehler war etwas unerwartet für mich. Hatte ich so noch nicht erlebt...

      Warum aber vergleichst du mit der Zahl 0 (egal ob String oder Zahl), wenn du da gar keine 0 erwartest? Es gäbe da beispielsweise null für einen nicht vorhandenen Wert.

      Doch, eine 0 erwarte ich ja. Nämlich dann, wenn der User kein Wasserzeichen setzen möchte, kann er eine 0 anstelle eines Pfades/Datei angeben.

      Jonny

      1. Tach!

        Doch, eine 0 erwarte ich ja. Nämlich dann, wenn der User kein Wasserzeichen setzen möchte, kann er eine 0 anstelle eines Pfades/Datei angeben.

        Das ist aber nicht besonders sinnvoll, so ein Typ-Mischmasch. Wie gesagt, null steht für nichts. 0 ist nur im Zahlenumfeld eine sinnvolle Größe für "kein".

        dedlfix.

        1. Das ist aber nicht besonders sinnvoll, so ein Typ-Mischmasch. Wie gesagt, null steht für nichts. 0 ist nur im Zahlenumfeld eine sinnvolle Größe für "kein".

          Ok, verändere ich. Danke, Jonny

      2. @@Regenbogenjonny

        Doch, eine 0 erwarte ich ja. Nämlich dann, wenn der User kein Wasserzeichen setzen möchte, kann er eine 0 anstelle eines Pfades/Datei angeben.

        Warum sollte der Nutzer eine Eingabe machen, wenn er keine Eingabe machen möchte?

        "0" ist eine Eingabe, ein leergelassenes Eingabefeld ist keine.

        Oder ein (vor)angewählter Radiobutton „kein Wasserzeichen“. Oder eine nicht angewählte Checkbox „Wasserzeichen“. Wobei in beiden Fällen das Eingabefeld für den Pfad zum Wasserzeichen versteckt werden kann.

        LLAP 🖖

        --
        Ist diese Antwort anstößig? Dann könnte sie nützlich sein.
        1. Hi Gunnar,

          Doch, eine 0 erwarte ich ja. Nämlich dann, wenn der User kein Wasserzeichen setzen möchte, kann er eine 0 anstelle eines Pfades/Datei angeben.

          Warum sollte der Nutzer eine Eingabe machen, wenn er keine Eingabe machen möchte?

          "0" ist eine Eingabe, ein leergelassenes Eingabefeld ist keine.

          Oder ein (vor)angewählter Radiobutton „kein Wasserzeichen“. Oder eine nicht angewählte Checkbox „Wasserzeichen“. Wobei in beiden Fällen das Eingabefeld für den Pfad zum Wasserzeichen versteckt werden kann.

          Um den Endnutzer geht es ja nicht. Es geht um den Nutzer der Klasse.

          Jonny

          --
          > Ist diese Antwort anstößig? Dann könnte sie nützlich sein.
          1. @@Regenbogenjonny

            Um den Endnutzer geht es ja nicht. Es geht um den Nutzer der Klasse.

            „Nämlich dann, wenn der User kein Wasserzeichen setzen möchte, kann er eine 0 anstelle eines Pfades/Datei angeben“ las sich anders.

            Du meinst „Programmierer, der diese Klasse verwendet“? „Nutzer“ ist im Sprachgebrauch so fest mit dem Nutzer der Anwendung verbunden, dass man den Begriff nicht anderweitig verwenden sollte.

            LLAP 🖖

            --
            Ist diese Antwort anstößig? Dann könnte sie nützlich sein.
            1. Hallo Gunnar,

              Du meinst „Programmierer, der diese Klasse verwendet“? „Nutzer“ ist im Sprachgebrauch so fest mit dem Nutzer der Anwendung verbunden, dass man den Begriff nicht anderweitig verwenden sollte.

              In deinem vielleicht. Das ist aber je nach peer group anders. Bei der Entwicklung von System-Diensten meint man damit z.B. oft den Anwendungsentwickler.

              LG,
              CK