Zum Inhalt springen

tuerchen 05 · 5. Dezember

Lose Vergleiche, lose Nerven

Was gibt der Code aus?MittelPHP 8.4

Aufgabe

PHP 8 hat den losen Vergleich zwischen Zahlen und Strings aufgeräumt. Aber wie gründlich? Jeder Vergleich wird zu T (true) oder F (false). Was steht am Ende da?

<?php

$checks = [
    'abc' == 0,
    '1abc' == 1,
    '0' == false,
    '' == null,
    ' 1' == 1,
    '1 ' == 1,
];

echo implode('', array_map(fn (bool $b) => $b ? 'T' : 'F', $checks));
  • aTTTTTT
  • bFFTTTF
  • cFFTTTTrichtig
  • dFTTTTT
Tipp anzeigenkostet keine Punkte

Seit PHP 8 hängt das Ergebnis davon ab, ob der String als Zahl gilt. Prüf jeden String einzeln mit is_numeric() im Kopf.

Mitraten geht mit deinem kostenlosen Entwicklerkonto

Lesen darf jeder. Punkte, Bestenliste und Preise gibt es nur mit Konto.

Auflösung

Richtig ist c.

Seit PHP 8 (RFC Saner string to number comparisons) gilt: Ist der String numerisch, wird als Zahl verglichen, sonst wird die Zahl in einen String umgewandelt und als String verglichen.

  • 'abc' == 0 → 'abc' == '0' → F (in PHP 7 noch true!)
  • '1abc' == 1 → '1abc' ist nur führend numerisch → '1abc' == '1' → F
  • '0' == false → Vergleich mit bool: '0' ist falsy → T
  • '' == null → beides wird zu '' → T
  • ' 1' == 1 und '1 ' == 1 → führender und (seit PHP 8) nachgestellter Leerraum gilt als numerisch → T T

PHP 7 hätte übrigens TTTTTT ausgegeben. Moral: Nimm ===, dann musst du dir diese Tabelle nicht merken.

Zurück zum Kalender