Perché PHP considera "0" come FALSE in contesti booleani?

10

"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?

    
posta Michael Tsang 19.12.2016 - 10:31
fonte

2 risposte

10

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'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'

    
risposta data 19.12.2016 - 11:27
fonte
3

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

    
risposta data 19.12.2016 - 10:38
fonte

Leggi altre domande sui tag