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 anzeigenTipp ausblendenkostet 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' == 1und'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.