PHP è stato progettato (o, piuttosto, evoluto) per l'uso con richieste Web, in cui hai spesso a che fare con l'input di stringhe (parametri URL o richieste POST da un modulo in un browser). Come tale, lancerà automaticamente le stringhe su altri tipi.
Un semplice esempio di ciò è che '1' + '2'fornisce 3, non un errore, o '12', o qualche altra interpretazione. Secondo la stessa logica, la stringa '0'può essere utilizzata come un numero 0.
Nel frattempo, come molte altre lingue, PHP tratta alcuni valori come "falsi" quando espressi in booleani - quelli che sono intuitivamente "vuoti", come dici tu. Ciò include i valori numerici 0, nonché la stringa vuota ''e l'array vuoto []. In una ifdichiarazione, l'espressione è esplicitamente lanciata su booleana, quindi if ( 0 )è la stessa di if ( false ).
Mettendo insieme queste due cose, ottieni un enigma: da un lato, come dici tu '0'è una stringa non vuota; d'altra parte, abbiamo detto che può essere usato come un numero 0, che è "vuoto". PHP sceglie di considerare la "nullità" più importante della "rigidità", quindi '0'viene considerata "falsa".
In breve '0' == 0 == false:; o(bool)'0' === (bool)(int)'0'