Así es como se ve el PHP moderno

Por Faraz Usmani (Flickr) [CC BY 2.0 ( http://creativecommons.org/licenses/by/2.0 )], a través de Wikimedia Commons

El título es realmente pretencioso, ¿verdad? Sí lo es. Aunque he estado trabajando con PHP durante años, ¿cómo podría indicar cuáles son las mejores prácticas y herramientas para el trabajo? No pude, pero lo haré.

Estoy viendo un cambio real en la forma en que los desarrolladores hacen su trabajo con PHP, no solo el lenguaje cambia drásticamente para volverse más maduro y robusto con nuevas versiones y mejoras, sino que todo el ecosistema a su alrededor está cambiando.

Se están creando nuevas herramientas, bibliotecas, marcos y artículos, se están definiendo patrones para hacer que el código sea más elegante y fácil de entender. Varias personas están pensando en maneras de hacer que el trabajo (y su vida como desarrollador) sea más productivo, limpio y divertido.

No soy un pionero de las nuevas tendencias, de hecho, solo adopto una nueva herramienta cuando estoy seguro de que hay una comunidad detrás de esto y realmente creo que mejorará mi trabajo. Lo que siempre hago es intentar escribir mi código siguiendo las mejores prácticas.

Por eso, me tomó tiempo comenzar a usar cosas como Composer y PHPUnit. Hace aproximadamente un año, más o menos, abrí mi corazón a todas esas cosas nuevas y brillantes.

PSR fue primero, luego Composer, PHPUnit, Travis-ci y varias otras bibliotecas y herramientas increíbles. Incluso estoy usando un IDE ahora (¡Vim FTW, pero PHPStorm con integración XDebug es imprescindible para un flujo de trabajo sensato)!

¿Qué es moderno?

Por Karen Roe (Flickr) [CC BY 2.0 ( http://creativecommons.org/licenses/by/2.0 )]

Hay toneladas de artículos alrededor de la web sobre cuán horrible es PHP, cómo sería tu vida terrible si tuvieras que trabajar con código PHP, cómo es el lenguaje feo y cualquier otra cosa que se te ocurra.

Si vas a trabajar con código heredado, tal vez tu vida no sea tan buena, pero si tienes la oportunidad de trabajar en un nuevo proyecto y puedes usar todas las herramientas nuevas, verás este nuevo PHP Voy a hablar sobre eso.

Tengo varios problemas para trabajar con PHP diariamente, pero uno no puede cerrar los ojos a los cambios que tienen lugar en el idioma, la comunidad y el ecosistema. Hay un largo camino por delante, pero las cosas están madurando en la tierra de PHP.

Empecé a crear un SDK para una API interna en la empresa para la que trabajo, como un proyecto favorito, y decidí seguir las mejores prácticas. La mayoría de ellos ya lo estaba haciendo, pero he hecho algunos cambios en la forma en que hago algunas cosas. Esos cambios y lo que aprendí en el último año son el tema de este artículo y de lo que llamo Modern PHP.

Comencemos con el flujo de trabajo

TRIO FABRIKKER – https://nos.twnsnd.co

Como dije, soy un recién llegado a esta cosa IDE, pero fue amor a primera vista. PHPStorm es una gran pieza de software. Es mi primer y único IDE. Fue mi primer intento y ni siquiera necesito probar otro.

La integración con XDebug es perfecta, resolución de espacio de nombres PHP, integración de compositores, integración de git, autocompletado, generación de código, refactorización de código. Podría seguir y seguir.

No creo que deba usar un IDE, en realidad, este punto es completamente personal. Debería usar lo que se ajuste a sus necesidades: Vim, Atom, Emacs, Bracket, NetBeans, PHPStorm, Eclipse, lo que sea. Dos puntos importantes aquí son la productividad y la ergonomía. Su IDE / editor de texto debe estar allí para ayudarlo.

Sin embargo, para mí, un gran punto es la integración del depurador. Para escribir código para grandes proyectos (en realidad para los pequeños también) debes usar un depurador decente. Olvidémonos de esos var_dumps e print_rs. Necesita insertar esas variables en el tiempo de ejecución, analizar las trazas de pila, establecer puntos de interrupción. Estas cosas son esenciales y facilitan el desarrollo y la refactorización.

Ni siquiera sé si hay otras opciones aquí, XDebug tiene todo lo que necesitas. ¿Tienes unos minutos? Si aún no lo ha hecho, tómese un momento para configurar XDebug e integrarlo en su IDE o editor de texto. Comience a depurar su código con las herramientas adecuadas.

La otra herramienta a la que quiero llamar su atención es GitHub. Se podría escribir otro artículo completo sobre cuán buenos son Git y GitHub y por qué debe comenzar a mantener su código en un sistema de control de versiones. Pero quiero mostrarte otra razón.

El enfoque aquí es la integración.

Hay varias herramientas que se integran con GitHub y debería comenzar a usarlas. Esas herramientas pueden generar métricas, ejecutar pruebas, ejecutar trabajos para usted durante un proceso de integración continua y hacer todo tipo de cosas en su flujo de trabajo. La integración es una buena razón para que comiences a usar GitHub, todos los demás están sujetos por otro momento.

Gestión de dependencia

INSTITUTO PASTEUR. LISBOA, PORTUGAL – https://nos.twnsnd.co

Otro punto en este ecosistema PHP moderno es la gestión de la dependencia, y Composer es la herramienta para el trabajo.

Compositor tiene 5 años, pero me parece que la adopción masiva tuvo lugar hace un par de años. Tal vez porque no soy un adoptante temprano o quizás porque los desarrolladores de PHP son reacios a cambiar.

Esta herramienta proporciona una interfaz para Packagist, que es un repositorio de paquetes PHP que consta de bibliotecas PHP, proyectos y herramientas, cuyo código fuente está almacenado en Github (u otros lugares como BitBucket).

Todas las bibliotecas de las que estoy hablando en este artículo, y tal vez uno de esos proyectos favoritos de ustedes, se pueden agregar a su proyecto con un simple

 $ composer require package_vendor / package_name 

Si no conoce el proveedor de un paquete, puede search un paquete para encontrar e instalar el correcto.

 $ composer search package_name 

Composer sería una gran herramienta si solo hiciera esto, administrara dependencias, pero hace mucho más. Tómese un tiempo para instalar Composer y leer la documentación .

Interfaz de línea de comando hecho a la derecha

Realmente me gusta probar ideas rápidamente usando interfaces CLI. Para mí, una de las mejores herramientas de REPL es el IPython . Le ayuda a autocompletar su código, le permite definir funciones fácilmente, facilitar el acceso a la documentación y muchas otras características increíbles. La desventaja para nosotros es que la herramienta es para Python, no para PHP.

En el mundo PHP tenemos algo llamado "modo interactivo" al que se puede acceder por terminal, simplemente escribiendo

 $ php -a 
Modo interactivo habilitado
 php> 

En este punto, estás en el modo interactivo y puedes comenzar a probar algo. Funciona, pero la herramienta es demasiado intuitiva. Lo intenté varias veces pero, como sabía lo que IPython podía hacer, no pude seguir usándolo.

Para nuestra suerte, hay una nueva y genial CLI (interfaz de línea de comando) en el bloque y su nombre es Psysh. Psysh es una herramienta increíble, llena de características interesantes y se puede instalar globalmente o por proyecto usando el compositor.

La mejor característica de Psysh para mí es la documentación en línea. Acceder al documento de una función de PHP sin dirigirse a Php.net es genial. El inconveniente es que debe hacer algunas cosas antes de que sea completamente funcional.

Después de instalarlo, escriba los siguientes comandos (estoy usando Debian aquí, esto puede no funcionar para todos) para que funcione correctamente

 $ apt-get install php7.1-sqlite3 
$ mkdir / usr / local / share / psysh
$ wget http://psysh.org/manual/en/php_manual.sqlite -o /usr/local/share/psysh/php_manual.sqlite

El primer comando no es obligatorio y si ya tiene Sqlite instalado, puede omitir este paso. El segundo comando crea el directorio para almacenar la documentación y la tercera línea descarga y guarda el documento en el directorio creado previamente. Recuerde, todos estos comandos deben ejecutarse como root.

Ahora tienes esto

Captura de pantalla de psysh doc en acción, que muestra información sobre json_decode

Dirígete a Psysh y aprende más sobre esta increíble herramienta.

Deberías comenzar a probar

Este es un mantra que me digo todos los días. Al igual que mucha gente, no pruebo mi código tanto como lo sugiere TDD. Me estoy poniendo a prueba ahora y lo he estado haciendo durante el último medio año, y hay un largo camino por delante.

Decidí aprender acerca de las pruebas al trabajar con un proyecto heredado complejo. El código era tan frágil y rígido que cada vez que agregamos algún código, rompió algo. ¿Nueva caracteristica? ¡Implementa y rompe algo! ¿Reparar un error? Crea otro.

Ese fue un gran problema, que discutí en otro artículo , y me hizo comenzar a dar pruebas.

La primera herramienta que me presentaron fue PHPUnit . Como se indica en el sitio oficial

PHPUnit es un marco de prueba orientado a programadores para PHP.
Es una instancia de la arquitectura xUnit para marcos de prueba de unidades.

Entonces, PHPUnit es un marco para ayudarlo a crear pruebas para sus proyectos, pruebas unitarias. Te da varias funciones para probar el resultado de tu código y generar un buen resultado con el resultado de esas pruebas.

Desde que empecé a pensar en las pruebas, leer y hablar con la gente sobre el tema, descubrí otra gran herramienta que complementa el trabajo que ha realizado en esas pruebas unitarias, es la calle Behat, que es un marco BDD para PHP.

BDD (Desarrollo impulsado por el comportamiento) es un proceso de desarrollo que proviene de TDD (Desarrollo controlado por pruebas). Esos acrónimos no son importantes ahora, lo importante es que puede especificar sus pruebas utilizando un lenguaje más natural, un lenguaje que las personas no técnicas pueden entender.

Este lenguaje se llama Gherkin y se usa para describir el comportamiento esperado que se prueba. Una descripción de prueba, usando Gherkin, se ve así

Detrás de esas líneas hay un código PHP que se llama siempre que haya una coincidencia entre una línea y un patrón de expresiones regulares especificado en PhpDoc del método. Este código implementa esos pasos y lo que un usuario real haría, usando su SDK, aplicación o sistema web.

El flujo de trabajo con Behat es muy sencillo. Después de todo configurado correctamente, comienza a escribir todos los escenarios posibles para probar una característica. La primera vez que ejecuta Behat, le da todas las plantillas de métodos que debe agregar a su clase de contexto PHP para implementar cada paso en un escenario.

Después de eso, comienzas a escribir el código real para cada paso y sigues repitiendo este ciclo.

  • Implementar el código PHP para un paso
  • Ejecutar pruebas
  • Si todo está bien, escriba el código PHP para otro paso
  • Si algo está roto, arréglalo

Después de media hora de configurar y leer la documentación, estás preparado para usar Behat, verás que al final todo es código PHP y ya sabes cómo programarlo.

Integración continua

La integración continua (CI) es un proceso, una forma de hacer algo, y esto, para nosotros los ingenieros de software, es crear software.

En lenguaje sencillo, es el acto de incorporar pequeños trozos de código constantemente (tal vez varias veces al día) en su base de código. Código que ha sido probado y no ha roto nada. CI lo ayuda a automatizar la creación, prueba e implementación de sus aplicaciones.

Con unos pocos clics puede integrar su proyecto GitHub con Travis CI y cada inserción en su repositorio ejecutará las pruebas que haya creado con PHPUnit y Behat, indicándole si la última característica que implementó está lista, o no, para fusionarse. . Además de eso, puede usar Travis CI para implementar su código en producción y puesta en escena.

Tener una buena línea de trabajo con un proceso bien definido es excelente y Travis CI puede ayudarlo con este trabajo. Sigue este buen comienzo y descubre lo interesante que es pensar en el proceso de desarrollo de software, no solo en el código en sí.

Adherirse a PSR-1 y PSR-2

Si no sabe qué es PSR, debería hacerlo. En realidad, PSR significa PHP Standard Recommendations y es propuesto por PHP-FIG (PHP Framework Interop Group), un consorcio formado por miembros de los mayores proyectos, frameworks y CMS de PHP, que están pensando en el futuro del lenguaje, el ecosistema y la discusión estándares a seguir.

Durante mucho tiempo, PHP no tenía un estilo de codificación. No soy tan viejo, pero cada vez que busqué en el proyecto o la biblioteca de alguien, estaba siguiendo un estilo diferente. A veces el soporte se dejaba en una posición, a veces se colocaba en la siguiente línea, se usaban diferentes enfoques para tratar con las líneas largas y cualquier otra combinación de estilo y preferencia que se le ocurriera. Fue un desastre.

PHP-FIG hace muchos otros trabajos, pero proponiendo una sola unidad de código, dicen "Dejemos de preocuparnos por el estilo del código, todos sigamos un estándar y comencemos a pensar en crear un gran software". Ahora, cada vez que echas un vistazo al código de alguien simplemente te preocupa comprender cómo funciona, sin culpar al formato, a la estructura.

Hasta el final de este artículo, 9 aceptaron PSR que proponen soluciones comunes para problemas comunes. Pero si no sabe nada sobre esos estándares, comience con el PSR-1 y el PSR-2 .

Estos estándares proponen el estilo de codificación PHP moderno. Asegúrese de leerlos antes de comenzar a usarlos. No pienses que los recordarás todos al codificar, es un proceso, pero para asegurarte, hay herramientas que te pueden ayudar.

PHP CodeSniffer es una herramienta que puedes encontrar en Packagist que puedes instalar con Composer. No creo que el nombre del repositorio sea la mejor opción, ya que incluye dos herramientas diferentes, phpcs y phpcbf.

Phpcs es el detector de códigos, escaneará todo su código, buscando partes que no sigan el estándar de codificación configurado.

Puede usar varios estándares de codificación con phpcs e incluso puede crear los suyos propios. Al final del escaneo de código, phpcs le muestra una lista de las piezas de código que no siguen el estándar. Eso es genial.

Ahora, ¿cómo cambiar todo lo que está mal? Puede abrir cada archivo, cambiar el código, ejecutar phpcs nuevamente, ver que no se muestra el error y repetir el proceso. Será extra aburrido.

Para resolver este problema, PHP CodeSniffer viene con otra herramienta, llamada phpcbf, o PHP Code Beautifier. Ejecuta phpcbf, sigue el mismo conjunto de reglas y, voilá, arregla todo para usted, o intenta hacer todo lo posible sin romper su código.

Intente crear el hábito de ejecutar phpcs y phpcbf antes de enviar cualquier cambio en su código al repositorio, esto asegurará que todo su código cumpla con los estándares y si a alguien le gusta su herramienta / proyecto y desea contribuir, no tendrá problema al leerlo

Frameworks

No voy a dedicar demasiado tiempo a discutir marcos. Hay varios buenos por ahí, cada uno con sus altibajos. Personalmente, prefiero no usar esos grandes frameworks, con todo lo que hay dentro. Me gusta la idea de que debe usar exactamente lo que necesita.

Si necesita un cliente HTTP, use Guzzle. Si necesita un motor de plantillas, use Twig. Si necesita un enrutador, encuentre un buen componente que se adapte a sus necesidades y úselo. Pegue estos componentes y cree su aplicación.

Symfony está haciendo un gran trabajo con este concepto. Puede usar todo el marco para un proyecto, o simplemente puede tomar lo que quiera y usarlo. Simple como eso.

Sin embargo, cada vez que necesito un marco para escribir una aplicación, elijo uno de los llamados microframeworks. Son realmente pequeños, ofrecen solo lo básico y son fáciles de personalizar y más fáciles de hacer para que sigan la estructura de su proyecto.

Mi microframework de elección es Slimframework y creo que deberías leer al respecto. Es simple para hacer pequeños proyectos, pero se vuelve un poco más complejo para los más grandes.

Por cierto, y esto es para aquellos que están comenzando con la programación, realmente creo que antes de adoptar un marco y morir por él, deberían intentar crear uno propio. Esto le dará la comprensión de todo el mecanismo y facilitará la adopción de uno grande.

El conjunto de herramientas PHP moderno

Vamos a terminar este artículo con una lista de enlaces. Para mí, estos componentes, herramientas y bibliotecas representan una gran parte de lo que es PHP moderno:

  • Slimframework : un microframework agradable y genial
  • Symfony : un marco más grande que está lleno de componentes excelentes y reutilizables
  • Guzzle : un cliente HTTP simple y fácil de usar
  • PHPUnit : un marco para pruebas unitarias
  • Behat : un marco para el desarrollo impulsado por el comportamiento
  • PHPCS / CBF : sniffer de código y embellecedor de código
  • Faker : generador de datos falsos
  • Psysh : una consola de desarrollo en tiempo de ejecución (CLI) llena de características increíbles
  • Compositor : gestión de la dependencia y otras funciones útiles
  • Packagist : repositorio de paquetes
  • Twig : motor de plantillas

El título era realmente pretencioso, lo sé. Lo que realmente quería mostrar aquí es que PHP está evolucionando y el ecosistema está evolucionando al mismo ritmo (quizás más rápido).