"0", come una stringa contenente un carattere, non è qualcosa di vuoto intuitivamente. Perché PHP lo considera FALSO quando viene convertito in un booleano, a differenza di altri linguaggi di programmazione?
"0", come una stringa contenente un carattere, non è qualcosa di vuoto intuitivamente. Perché PHP lo considera FALSO quando viene convertito in un booleano, a differenza di altri linguaggi di programmazione?
PHP è stato progettato (o, piuttosto, evoluto) per l'uso con le richieste web, dove si tratta spesso di input di stringa (parametri URL o richieste POST da un modulo in un browser). In quanto tale, esegue automaticamente il cast delle stringhe su altri tipi.
Un semplice esempio di questo è che '1' + '2'
dà 3
, non un errore, o '12
', o qualche altra interpretazione. Con la stessa logica, la stringa '0'
può essere utilizzata come valore numerico 0
.
Nel frattempo, come in molte altre lingue, PHP considera determinati valori come "falsi" quando vengono convertiti in booleani - quelli che sono intuitivamente "vuoti", come dici tu. Questo include 0
numerico, così come la stringa vuota ''
e l'array vuoto []
. In un'istruzione if
, l'espressione viene esplicitamente convertita in booleana, quindi if ( 0 )
è uguale a if ( false )
.
Mettendo insieme queste due cose, si ottiene un enigma: da un lato, come dici tu '0'
è una stringa non vuota; d'altra parte, abbiamo detto che può essere usato come valore numerico 0
, che è "vuoto". PHP opta per trattare lo "zero-ness" come più importante della "stringiness", in modo che '0'
sia considerato "falsy".
In breve: '0' == 0 == false
; o (bool)'0' === (bool)(int)'0'
Secondo la documentazione di PHP su booleans , Dice questo:
When converting to boolean, the following values are considered
FALSE
...
the empty string, and the string "0"
...
In caso contrario:
Every other value is considered TRUE (including any resource).
Se corri:
var_dump((bool) "0");
Stampa:
bool(false)
Quindi funziona come previsto.
Per rispondere esplicitamente alla tua domanda:
However, in most cases the cast is unnecessary, since a value will be automatically converted if an operator, function or control structure requires a boolean argument.
Ciò significa che "autocast" di PHP convertirà "0" in intero 0, che è FALSE
pure in una struttura di controllo come dire un'istruzione if()
.