Ankündigung

Einklappen
Keine Ankündigung bisher.

Ungewöhnliches Verhalten

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Ungewöhnliches Verhalten

    Hallo,

    kann das jemand bestätigen?

    PHP-Code:
    $foo='Test';
    if(
    $foo==0){
    echo(
    'OK');

    Ausgabe ist OK??

    getestet Linux Debian 8.11 && 9.8
    PHP Version 5.6.40-0+deb8u4
    PHP Version 7.0.33-0+deb9u2

  • #2
    Ich hoffe das hier hilft dir weiter
    https://stackoverflow.com/questions/...trange-results

    Kommentar


    • #3
      PHP-Code:
      <?php

      $foo 
      'Test';

      var_dump( (int)'Test' ); // int 0

      // Daher
      if( $foo === ){
         echo 
      'OK';
      }
      ?>
      https://www.php.net/manual/de/langua...comparison.php

      Kommentar


      • #4
        Ja Danke, scheint doch nicht so ungewöhnlich zu sein.

        Kommentar


        • #5
          Deswegen verwendet man auch === und nicht ==.

          Kommentar


          • #6
            bleibt aber inkonsequent, weil

            PHP-Code:
            var_dump((bool)'Test'); // true
            var_dump((int)'Test'); // 0
            var_dump((bool)0); // false 
            [I]You know, my wife sometimes looks at me strangely. „Duncan“, she says, „there's more to life than Solaris“. Frankly, it's like she speaks another language. I mean, the words make sense individually, but put them together and it's complete nonsense.[/I]

            Kommentar


            • #7
              Das ist aber nur halb richtig, da es ja dokumentiert ist
              https://www.php.net/manual/de/function.boolval.php

              das heißt alles was „leer“ ist wird als False gekennzeichnet und alles andere als True.

              in Java ist das anderes da wird ein String z.b. immer zu lowercase Konvertiert und dann mit true verglichen.

              kann man jetzt gut oder schlecht finden, aber wie oft Konvertiert man Strings zu einem bool?
              Eher int(0 oder 1) zu bool und das funktioniert ja richtig

              Kommentar


              • #8
                Hier geht es doch um ===, oder irre ich?
                PHP-Code:
                $var 'Test';

                var_dump$var === );                  // false
                var_dump( (bool)$var === );            // false
                var_dump$var === (bool));            // false
                var_dump( (bool)$var === (bool));      // false 
                sehe da nichts inkonsequentes...
                Competence-Center -> Enjoy the Informatrix
                PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

                Kommentar


                • #9
                  Zitat von chorn Beitrag anzeigen
                  bleibt aber inkonsequent, weil

                  PHP-Code:
                  var_dump((bool)'Test'); // true
                  var_dump((int)'Test'); // 0
                  var_dump((bool)0); // false 
                  Nicht inkonsequent. In Deinem Beispiel geht in der zweiten Zeile die Information 'Test' verloren bzw. Du konvertierst sie irreversibel in eine andere Information. Natürlich kannst Du das dann nicht mehr mit (bool)'Test' vergleichen. Aus (string)true kriegst Du ja auch kein 'Test' mehr heraus.

                  Kommentar


                  • #10
                    Und genau das macht für mich keinen Sinn. Warum wird ein String der true ist wenn ich ihn downgrade false?

                    Code:
                    "Test" == true
                    aber
                    (int)"Test" == false
                    Intuitiv würde ich als Intrepräsentation eines Strings dessen Länge annehmen

                    Code:
                    "" == 0 == false
                    "Test" == 4 == true
                    Klar hat die Konvention von PHP Vorteile, halte ich trotzdem für Müll.

                    Aber wenigstens scheint das symmetrisch zu sein

                    https://www.php.net/manual/en/types.comparisons.php
                    [I]You know, my wife sometimes looks at me strangely. „Duncan“, she says, „there's more to life than Solaris“. Frankly, it's like she speaks another language. I mean, the words make sense individually, but put them together and it's complete nonsense.[/I]

                    Kommentar


                    • #11
                      Zitat von chorn Beitrag anzeigen
                      Und genau das macht für mich keinen Sinn. Warum wird ein String der true ist wenn ich ihn downgrade false?

                      Code:
                      "Test" == true
                      aber
                      (int)"Test" == false
                      Weil der Cast zu int false erzeugt, bzw. aus einem String, der keine Zahl repräsentiert wird 0, also false im boolschen Sinne.
                      Klingt für mich bis dahin nicht unlogisch für PHP.
                      Competence-Center -> Enjoy the Informatrix
                      PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

                      Kommentar


                      • #12
                        Dass die Konvention und die Implementierung das so vorschreiben ist mir bekannt und daran kann ich auch nichts ändern, trotzdem sehe ich nicht warum sich durch den Zwischenschritt über Int die boolsche Repräsentation verlieren/verändern sollte.
                        [I]You know, my wife sometimes looks at me strangely. „Duncan“, she says, „there's more to life than Solaris“. Frankly, it's like she speaks another language. I mean, the words make sense individually, but put them together and it's complete nonsense.[/I]

                        Kommentar


                        • #13
                          Ich finde ja das Type-Handling von PHP noch recht überschaubar und in den meisten Fällen tut es auch das, was man erwarten würde. Ganz im Gegenteil von JavaScript, das zwar (wenn man es weiß) einer vorgegebenen Struktur folgt, aber nicht menschlich logisch nachvollziehbar ist.

                          Folgendes Beispiel zeigt deutlich, in welche Fallen JavaScript führen kann:
                          Code:
                          console.log(typeof(NaN)); // NaN = not a number
                          Ausgabe:
                          Code:
                          number
                          So oder so würde ich bei Vergleichen fast immer das typstarke === vorziehen, um Überraschungen zu vermeiden.

                          Kommentar


                          • #14
                            Hier gibt es auch noch einen netten Beitrag dazu, welche Fallen da so lauernm, wenn man nicht mit === arbeitet: https://php-de.github.io/jumpto/stringvergleiche/
                            The string "()()" is not palindrom but the String "())(" is.

                            Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                            PHP.de Wissenssammlung | Kein Support per PN

                            Kommentar


                            • #15
                              chorn Welche Wert bei einem int-Cast für einen String sollte denn Deiner Meinung nach herauskommen? 42? 23?

                              Das ist ja dann letzten Endes die Frage, wenn Du danach einen boolschen Vergleich anstellen möchtest.

                              Kommentar

                              Lädt...
                              X