En el origen de los tiempos, PHP no estaba tan organizado como lo está ahora. Era habitual encontrar los programas PHP divididos en ficheros .inc. También era habitual el descargar los ficheros de las librerías o componentes manualmente. Luego había que incluir todas las partes manualmente para hacerlo funcionar como un todo. Surgían conflictos de nombres, era difícil hacer crecer una aplicación, se incrustaba mucho el código programado en las plantillas. No había mucho orden, o había el orden que se podía esperar, de un lenguaje de programación tan nuevo.
Todo esto ha cambiado con el pasar de los años hasta la fecha en que escribo este post. PHP se creó en 1994, por Rasmus Lerdorf. Ha llovido mucho desde entonces, y han llegado muchas cosas por el camino como Composer, Twig, el PSR, la HipHop Virtual Machine, o la compilación JIT de la última versión de PHP 8, en la que los códigos compilarán a código máquina con lo que su velocidad será mayor.
Qué es el PSR, las PHP Standard Recomendations
PSR son una serie de recomendaciones que se siguen en los proyectos PHP habitualmente. Hay proyectos que nacieron hace mucho tiempo, que no se iniciaron siguiendo muchas de estas recomendaciones. Esto pasa por ejemplo en WordPress, en donde se ha priorizado la retro-compatibilidad y la simplicidad, alcanzando a un máximo de usuarios, y dando total libertad para hacer luego lo que queramos. Es decir, aunque WordPress no esté estructurado usando PSR-4, podemos usar PSR-4 en nuestros plugins o temas para WordPress.
Hay otros proyectos que se han refactorizado a sí mismos parcialmente o totalmente, como por ejemplo Drupal o Magento, con fuertes remakes de su parte en PHP siguiendo las PSR.
La idea es que se establecen una serie de recomendaciones a seguir para los proyectos. Unificando así la forma de desarrollar entre los proyectos con gran carga en PHP:
https://www.php-fig.org/psr/
Qué es la autocarga de clases, el PSR-4
Una de las recomendaciones que se dan en el PHP Framework Interop Gruop es la forma en que podemos organizar el código en directorios, ficheros, clases, etc.. El pararse a pensar antes de construir una aplicación es una parte importante. El diseño y arquitecturas del software son muy, muy, importantes. Doy fe de que los fallos, o por ausencia, de diseño o arquitectura pasan factura.
Por un lado, el ver cómo de grande va a ser, o qué partes serán necesarias, es difícil. Por otro lado, conviene refactorizar continuamente dividiendo el código a medida que crece en partes bien definidas y mantenibles. Lo que quiero decir es que estas partes, a veces, no hay porqué saberlas desde el inicio de un proyecto, pero conviene definirlas cuanto antes.
Cómo dividir el código fuente PHP en clases o partes
Esto no lo puedo reducir a un apartado de un post, pues es toda una profesión. La ingeniería del software, los sistemas distribuidos, las arquitecturas del software, etc.. son temas muy amplios. Pero lo que sí que podemos ver sencillo es el cómo sentar las bases en un proyecto con el PSR-4.
Al grano, cómo montar el PSR-4 en un proyecto nuevo
Sin más preámbulos, la forma de montar el PSR-4, la autocarga de clases, es mediante Composer. Composer es el sistema de gestión de dependencias de PHP. Mediante Composer se organizan y comparten la mayor parte de las librerías actualmente. De esta forma podemos comenzar a organizar un proyecto gracias a Composer muy fácilmente.
Simplemente lanzamos en línea de comandos a Composer:
composer init
..y seguimos las instrucciones. Esto generará uno fichero composer.json para el proyecto. Luego mientras que añadamos librerías se generará un fichero composer.lock que establece las versiones de cada elemento.
Para añadir la autocarga de clases bajo el directorio src/ como hace Symfony, bastaría con añadir lo siguiente en el fichero composer.json:
"autoload": {
"psr-4": {
"App\\": "src/"
}
},
Debería de verse como algo así en el fichero composer.json completo:
Cómo funciona la autocarga de clases
Después de lo anterior, ya tenemos todo listo para empezar a dividir el PHP lo mejor posible en todo tipo de ficheros y directorio. Aquí ya para gustos están los colores. Por ejemplo, con un proyecto mascota que tengo por aquí de esos que todos tenemos para aprender, se puede ver una estructura Symfony:
En esta imagen podemos ver cómo se organiza un proyecto en Symfony 4. Podemos ver que todo está donde tiene que estar. Todos los proyectos en Symfony tienen los controladores en la carpeta Controller, los repositorios en la carpeta Repository, los formularios en la carpeta Form, etcétera..
Resumiendo, todos los estos ficheros PHP, se podrán montar en el espacio de nombres App, en todas estas carpetas dentro del PSR-4 en src/. Por ejemplo con otra estructura como la de la imagen de inicio:
Podremos entonces establecer tantos directorios, clases, capas.. como queramos. Esto irá cambiando a lo largo del tiempo con cada refactorización, pero ayudará mucho el usar el PSR-4. Si por ejemplo queremos en cualquier parte del programa cargar el fichero Entity1.php que tiene una clase, simplemente añadiremos el use arriba y lo usamos, valga la redundancia:
use App\Repositories\Entity1;
..
$entity1 = new Entity1();
..
Igualmente para cualquier otra clase.
Y, ¿cómo funciona la autocarga de clases de terceros?
La otra parte buena de esta autocarga de clases, el PSR-4, es que podremos entonces también cargar todas las librerías que queramos. Además de que podremos diferenciar entre librerías que cargamos en producción, y en desarrollo.
Por ejemplo, imaginemos que sólo queremos cargar una serie de librerías en desarrollo. Podremos usar Composer haciendo:
composer require --dev nombreLibreria
Al usar el parámetro –dev, estas librerías no estarán en producción, agilizando así el rendimiento. Imaginemos que queremos por ejemplo PHPUnit en desarrollo y Swiftmailer en toda la aplicación, entonces:
composer require --dev phpunit/phpunit
composer require swiftmailer/swiftmailer
Ya siguiendo las instrucciones de cada librería simplemente se usan igual que con tus propias clases y ficheros, usando la palabra clave use para importarlo a la parte de la aplicación donde estemos.
Terminando y referencias
Ya está, esto no tiene más historia ? es sencillo, pero da mucho juego ? Sólo me queda remitirte a la página oficial del PHP-FIG para más información. Y a la página oficial de Composer para que añadas todas las librerías a tu aplicación que quieras.
Si has llegado hasta aquí espero no haberte aburrido. Si te ha parecido interesante comparte, dale like, deja un comentario y todas esas cosas.. ?