PSR-Duh!

En una lección anterior aquí en Nettuts +, aprendes sobre PSR; sin embargo, ese artículo no detalla el proceso de integración de ese estilo de codificación en sus proyectos. Vamos a arreglar eso!

Nota: este artículo asume que has leído PSR-Huh ?, y entiendes a qué se refiere PSR. Comencemos con el primer estándar: PSR-0.


PSR-0 - El estándar de carga automática

El complemento PHPCS es la herramienta más útil que he usado.

En el pasado, incluíamos los archivos PHP de una de estas dos maneras:

  • Usando un bloque gigante de instrucciones de inclusión en la parte superior de cada archivo.
  • Enumere todos los elementos incluidos en un solo archivo e incluya ese único archivo dentro de su proyecto.

Hay dos ventajas y desventajas en ambos enfoques, pero creo que todos podemos estar de acuerdo en que ninguno de los dos es una solución óptima o moderna. PHP5 introdujo el concepto de carga automática de archivos en función de sus nombres de clase; Por lo tanto, PSR-0 apunta a mantener los nombres de archivos consistentes.

Los espacios de nombres no tienen nada que ver con los nombres de archivos o la carga automática; Técnicamente puede declarar diferentes espacios de nombres en el mismo archivo. Por ejemplo, el siguiente código es perfectamente válido..

  

Hay dos Hola clases en este único archivo, pero residen dentro de diferentes espacios de nombres. Las dos últimas líneas de este código instancian la Hola() Clases en sus respectivos espacios de nombres. El primero da salida a "Nettuts +", mientras que el segundo hace un eco "Gabriel". Los espacios de nombres le permiten diferenciar entre dos clases con el mismo nombre, al igual que con las carpetas en su escritorio. El estándar PSR-0 simplemente aprovecha los beneficios de los espacios de nombres, lo que facilita la carga automática de sus clases. Al nombrar constantemente sus archivos, puede crear una función que localice los archivos necesarios automáticamente.

Para ser compatible con PSR-1, también debe seguir PSR-0.

Asegúrese de leer el estándar completo, pero para resumir:

  • Cada clase debe tener un espacio de nombre con el nombre del proyecto (o del creador).
  • Los guiones bajos dentro del nombre de la clase deben convertirse en separadores de directorios.
  • Los archivos deben tener el .php extensión.

Por ejemplo, una referencia de clase de:

 \ Nettuts \ Database \ SQL_Postgres

Si sigue el PSR-0, debería traducir a esta ruta:

 ./Nettuts/Database/SQL/Postgres.php

¿Cómo podríamos implementar esta funcionalidad? La solución más obvia es utilizar Composer, que se envía con un autocargador compatible con PSR-0. Si aprovecha Composer en sus proyectos (y debería), entonces opte por su cargador automático, en lugar de escribir su propio.

Un cargador compatible con PSR-0 le permite especificar una ruta base, informando al cargador en qué directorio buscar primero. Para empezar, crea un simple compositor.json archivo que contiene el siguiente JSON:

 "carga automática": "psr-0": "Nettuts": "./", "Gmanricks": "vendor /"

Este archivo JSON le dice a Composer que queremos usar el estándar PSR-0 para cargar automáticamente todos Nettuts-los archivos con espacios de nombre con el directorio actual (la carpeta raíz) como la ruta base. También queremos cargar automáticamente todas las clases con el Gmanricks espacio de nombres, en relación con el vendedor carpeta (por ejemplo,. ./ vendor / Gmanricks / ClassName).

Ahora, escriba "instalación del compositor"para generar las clases autoload, o"compositor dump-autoload"en ediciones subsiguientes para regenerar las clases de carga automática. Además, no olvide solicitar el cargador automático en algún momento del proyecto..

  

Composer es su mejor opción, pero puede haber situaciones en las que desee un cargador automático pequeño y simple. PHP-FIG proporciona un cargador automático de muestra que puede utilizar:

 función __autoload ($ className) $ className = ltrim ($ className, '\\'); $ fileName = "; $ namespace ="; if ($ lastNsPos = strrpos ($ className, '\\')) $ namespace = substr ($ className, 0, $ lastNsPos); $ className = substr ($ className, $ lastNsPos + 1); $ fileName = str_replace ('\\', DIRECTORY_SEPARATOR, $ namespace). DIRECTORY_SEPARATOR;  $ fileName. = str_replace ('_', DIRECTORY_SEPARATOR, $ className). '.php'; requiere $ fileName; 

Es importante tener en cuenta que este cargador intenta cargar todas las clases usando el estándar PSR en el directorio actual.

Ahora que ya hemos completado con éxito las clases, pasemos al siguiente estándar: el estándar de codificación básico.


PSR-1 - La norma básica de codificación

PSR-1 define pautas generales de codificación, que se pueden dividir en dos partes.

Convenciones de nombres

Los espacios de nombres le permiten diferenciar entre dos clases con el mismo nombre.

Al igual que con cualquier lenguaje de programación, las siguientes convenciones de nomenclatura hacen que su código sea más fácil de leer y mantener. Aquí hay algunas reglas a seguir:

  • Uso de nombres de clase PascalCase.
  • Los nombres de los métodos deben estar en el caso de Carmel.
  • Las constantes requieren todas las letras mayúsculas, separando cada palabra con un guión bajo (por ejemplo,. LA VARIABLE CONSTANTE).

Convenciones del Código:

Hay más que convenciones de nombres; siga estas pautas también:

  • Uso único o en su codigo No cierres PHP dentro de una clase.
  • Los archivos deben declarar símbolos o usarlos.
  • Los archivos deben estar en formato UTF-8 sin BOM para el código PHP

La mayoría de estos son autoexplicativos, pero la convención del medio es un poco confusa. Básicamente, dicta que cualquier declaración, ya sea funciones, clases, etc., debe separarse en sus propios archivos. Esto no solo promueve las mejores prácticas como la reutilización y la separación del código, sino que mantiene su código limpio y ordenado..

Vale la pena mencionar que cada estándar de PSR se basa en el estándar anterior de PSR. Como tal, para ser compatible con PSR-1, también debe seguir PSR-0. Al seguir estos dos estándares, su código tendrá un espacio de nombre y una carga automática adecuados. Realmente no hay una razón para no seguirlos..

Sí, algunos desarrolladores se quejan de PSR y prefieren seguir otras convenciones, pero al seguir este estándar, puede compartir el código con todos sin preocuparse por su consistencia. Habiendo dicho eso, nadie está forzando tu mano aquí. Es simplemente una guía recomendada..

El siguiente estándar, PSR-2, se adentra en los aspectos específicos de cómo debe estructurar su código.


PSR-2 - El estándar de codificación avanzada

PSR-2 se adentra en los aspectos específicos de cómo debe estructurar su código.

A continuación, llegamos al único estándar con el que más luchan los desarrolladores de PHP; De hecho, es la razón por la que elegí escribir este artículo..

PSR-2 define muchas reglas, muchas de las cuales se enumeran a continuación:

  • Se deben usar cuatro espacios en lugar de pestañas..
  • La longitud de línea ideal debe ser inferior a 80 caracteres, pero se debe imponer un límite suave de 120 caracteres en todas las líneas.
  • Debe haber una línea en blanco debajo del espacio de nombres y utilizar declaraciones.
  • La llave de apertura de un método o clase debe estar en su propia línea.
  • El refuerzo de cierre de un método o clase debe ir a la línea inmediatamente después del cuerpo..
  • Todas las propiedades y métodos requieren un nivel de visibilidad..
  • Los 'resumen'/'final'Las palabras clave deben aparecer antes de la visibilidad mientras'estático' Va después.
  • Las palabras clave de la estructura de control deben ir seguidas de un espacio.
  • La llave de apertura de una instrucción de control debe aparecer en la misma línea que la instrucción.

Asegúrese de ver la especificación completa para obtener una descripción completa.

PSR-2 es tan importante como PSR-1 (y PSR-0). Pretende hacer que el código sea fácil de leer y mantener. Pero, como dicen, "El diablo está en los detalles."Hay muchos detalles que recordar, que pueden ser difíciles si sus hábitos de programación difieren de lo que define el estándar. Afortunadamente, si está a bordo, hay herramientas que lo ayudan a cumplir con el PSR-0, el PSR-1 y PSR-2. Quizás la mejor herramienta sea el complemento de texto sublime, PHPCS.


PHPCS - PHP Code Sniffer

El complemento PHPCS es la herramienta más útil que he usado, cuando se trata de poner el código en forma. Le permite no solo asegurarse de que su código cumple con los estándares de PSR, sino que también utiliza la guía de PHP para verificar errores de sintaxis. Este es un gran ahorro de tiempo; ya no tendrá que preocuparse por los errores de sintaxis cuando pruebe su código en el navegador.

Instale el paquete a través de Sublime Package Control (se llama Phpcs) o, alternativamente, con Git, usando los siguientes comandos:

 cd ~ / Library / Application \ Support / Sublime \ Text \ 2 / Packages / git clone git: //github.com/benmatselby/sublime-phpcs.git Phpcs

Esto instala el complemento, pero necesita algunas dependencias antes de poder configurar PHPCS. Una vez más, la forma más fácil de instalarlos es con Composer. Vaya a un directorio de su elección y cree un compositor.json archivo con el siguiente JSON:

 "name": "Nettuts PHPCS Demo", "require": "squizlabs / php_codesniffer": "*", "fabpot / php-cs-fixer": "*", "phpmd / phpmd": "*" 

Esto instala las tres dependencias en la carpeta actual. Abra una ventana de terminal a su ubicación de instalación y escriba instalación del compositor, y se descargarán los paquetes necesarios..

Ahora puedes configurar el plugin en Sublime Text. Vaya a 'Preferencias'> 'Configuración del paquete'> 'Sniffer de código PHP'> 'Configuración - Usuario'.

El complemento necesita saber dónde residen las tres dependencias, así como el estándar que queremos que nuestro código respete:

 "phpcs_additional_args": "--standard": "PSR2", "-n": "", "phpcs_executable_path": "DEPENDENCY_PATH / vendor / bin / phpcs", "phpmd_executable_path": "DEPENDENCY_PATH / vendor / bin / phpmd "," php_cs_fixer_executable_path ":" DEPENDENCY_PATH / vendor / bin / php-cs-fixer "

Estas configuraciones informan a PHPCS que queremos acceder al estándar PSR2 y proporcionamos la ruta de cada dependencia. No te olvides de reemplazar DEPENDENCIA_PATH con tu camino real.

Reinicie Sublime, y el sniffer de código escaneará su código cuando guarde sus archivos PHP.

Al hacer clic con el botón derecho en el editor también se enumerarán varias opciones nuevas, como borrar las marcas de error e intentar solucionar los problemas no estándar. Sin embargo, teniendo en cuenta que el objetivo de este artículo es acostumbrarlo a la norma, le sugiero que corrija el código manualmente y evite las fijador característica.


Conclusión

Los estándares de PSR se crearon para que el código pudiera reutilizarse fácilmente de proyecto a proyecto, sin sacrificar la coherencia del estilo del código. Si bien pueden sentirse abrumadores al principio, puedes usar las ideas y herramientas de este artículo para ayudarte a hacer la transición..

Para reiterar una última vez: nadie te obliga a cambiar la forma en que codificas en PHP. Es simplemente una guía, originalmente diseñada para la interoperabilidad del marco. Dicho esto, en Nettuts +, consideramos que es una buena práctica a seguir. ¡Ahora decídete! Si tiene alguna pregunta, escuchémosla a continuación.!