"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() .