Mi sono imbattuto in una cosa molto strana:
$_SESSION['ciao'] = 0;
if ($_SESSION['ciao'] == 'bauh') {
echo "si";
}
è possibile?
Risolvo mettendo === ma mi sembra davvero strano!
Mi sono imbattuto in una cosa molto strana:
$_SESSION['ciao'] = 0;
if ($_SESSION['ciao'] == 'bauh') {
echo "si";
}
è possibile?
Risolvo mettendo === ma mi sembra davvero strano!
È possibile data la natura di PHP, che è un linguaggio a tipizzazione debole.
Quando deve confrontare due valori di tipo diverso, PHP tenta di fare una conversione (casting) prima di effettuare il confronto.
Nel tuo caso PHP tenta di convertire la stringa 'bauh' in un intero, assegnandole di fatto il valore 0. Dal confronto si ha 0 == 0, che è perfettamente true. Se provassi a fare un echo di '5' + 4 vedresti che il risultato è uguale a 9, in quanto '5' viene castato a 5.
Chiaramente utilizzando l'operatore === il confronto fallisce in quanto il tipo intero è diverso dal tipo stringa
https://www.php.net/manual/en/types.comparisons.php
C'è già il metodo === perché te ne serve un altro?
Non è che bauh viene letto 0, come ti ho già detto è una questioni di tipi. Se confronti interi con stringhe PHP converte la stringa in intero prima del confronto. Lo fa a runtime quindi non vedi realmente questa conversione.
Questa brutta caratteristica fa parte di PHP ma non funziona, o non dovrebbe funzionare, così nella programmazione. Con Java ad esempio, che è un linguaggio a tipizzazione forte, questo "strano" comportamento non succede.
Se vuoi che il confronto 0 == 'bauh' dia false o confronti '0' (stringa) con 'bauh' oppure come suggerito anche da Alhazred utilizzi l'operatore ===