PHP 4 (2000) era un lenguaje de scripting pensado para páginas web dinámicas. Simple, rápido de aprender y ubicuo: WordPress, Drupal y la mayoría de los sitios web corría sobre él. Fue el lenguaje que construyó la web sin querer.
Pero el código era un desastre estructural. Las funciones globales para todo sin capa de abstracción,
armas de destrucción masiva como register_globals que convertía automáticamente
los parámetros GET y POST en variables globales, abriendo la puerta a inyecciones triviales
o magic_quotes que escapaba automáticamente las cadenas de entrada
(lo que sonaba seguro y generaba el doble de problemas).
PHP 5 (2004) rehízo el modelo de objetos desde cero.
Por primera vez PHP tenía
constructores y destructores reales (__construct y __destruct),
visibilidad (public, protected y private), interfaces, clases abstractas y excepciones con try/catch.
PDO reemplazó a las funciones mysql_* con una capa de abstracción que funcionaba con MySQL, PostgreSQL
o SQLite sin cambiar el código.
PHP 5.3 (2009) añadió las dos características que cambiaron cómo
se escribe PHP hoy: namespaces y closures.
Sin namespaces, dos librerías con una clase Usuario colisionaban. Con namespaces,
App\Models\Usuario y Vendor\Auth\Usuario coexisten sin conflicto.
Con closures se podían crear funciones anónimas asignables a variables, pasables como argumento y capaces de cerrar
sobre variables del entorno con use. La programación funcional en PHP dejó de ser
un truco para convertirse en el idioma del lenguaje. Grandes proyectos como Symfony 2
ya los usan de forma intensiva.
El 1 de marzo de 2012 salió PHP 5.4 y con él desaparecieron oficialmente
register_globals y magic_quotes, dos de las características de PHP 4 que habían causado
más problemas de seguridad y más código roto que cualquier otra decisión de diseño en
la historia del lenguaje.
Con estos cambios, el lenguaje que durante años fue el blanco fácil de las críticas ha cambiado para siempre.