PHP fue diseñado (o, más bien, evolucionado) para su uso con solicitudes web, donde se trata con frecuencia de entrada de cadena (parámetros de URL o solicitudes POST de un formulario en un navegador). Como tal, automáticamente lanzará cadenas a otros tipos.
Un ejemplo simple de esto es que '1' + '2'da 3, no un error, o '12', o alguna otra interpretación. Por la misma lógica, la cadena '0'se puede usar como un número 0.
Mientras tanto, como muchos lenguajes, PHP trata ciertos valores como "falsos" cuando se convierten en booleanos, que son intuitivamente "vacíos", como usted dice. Eso incluye numérico 0, así como la cadena vacía ''y la matriz vacía []. En una ifdeclaración, la expresión se convierte explícitamente en boolean, por lo que if ( 0 )es lo mismo que if ( false ).
Al unir estas dos cosas, se obtiene un enigma: por un lado, como usted dice '0'es una cadena no vacía; Por otro lado, hemos dicho que puede usarse como un valor numérico 0, que está "vacío". PHP opta por tratar el "cero-ness" como más importante que el "stringiness", por lo que '0'se considera "falso".
En resumen: '0' == 0 == false; o(bool)'0' === (bool)(int)'0'