Introducción a la recomendación estándar de PHP (PSR)

Publicado: 2019-12-24

Érase una vez, en una conferencia, los desarrolladores principales de una selección de marcos se sentaron en la misma sala y acordaron algunos estándares para todos sus proyectos. El objetivo era hacer que los frameworks PHP y las bibliotecas fueran más fáciles de combinar para los usuarios. Fue entonces cuando nació php-fig: PHP Framework Interop Group. Este grupo de personas increíbles supervisa las recomendaciones de estándares de PHP (PSR).


La Recomendación estándar de PHP (PSR) es una especificación de PHP publicada por PHP Framework Interoperability Group (PHP-FIG). Sirve para la estandarización de conceptos de programación en PHP. El objetivo es permitir la interoperabilidad de los componentes. PHP-FIG está formado por varios fundadores de frameworks PHP.

PSR-0 y PSR-4

Estos describen una especificación para clases de carga automática desde rutas de archivo. PSR-0 y PSR-4 son estándares relacionados con espacios de nombres, nombres de clases y rutas de archivos. Este PSR también describe dónde colocar los archivos que se cargarán automáticamente de acuerdo con la especificación.

Carga automática

La carga automática es una funcionalidad para ayudar a los desarrolladores a incluir clases de PHP automáticamente sin escribir declaraciones de inclusión / solicitud desordenadas en todas partes.
En PHP, la definición de la clase se carga con declaraciones require o include en los archivos a los que se llaman, es decir, antes de usarla como se muestra a continuación.

imagen psr 1

El enfoque anterior plantea algunos problemas, como si tuviéramos decenas de clases externas para usar en un archivo y comenzáramos a escribir líneas de declaraciones require / include justo al comienzo de un archivo fuente.

Para superar este problema, PHP 5 introdujo la función mágica __autoload () que se llama automáticamente cuando su código hace referencia a una clase o interfaz que aún no se ha cargado.

imagen psr 2

Aquí hay un ejemplo de una implementación básica de __autoload ():

psr_image3

El mayor inconveniente de la función __autoload () es que solo puede proporcionar un cargador automático con ella. PHP 5.1.2 introdujo otra función de carga automática (spl_autoload_register) para hacer frente a la limitación de __autoload.

La introducción de spl_autoload_register () dio a los programadores la capacidad de crear una cadena de carga automática, una serie de funciones que se pueden llamar para intentar cargar una clase o interfaz.

Por ejemplo:

psr_image4psr_image5

La carga automática fue una idea tan buena que todos los proyectos empezaron a utilizarla. Inevitablemente, todos crearon su propia versión de cargador automático ya que faltaban estándares uniformes. Claramente, PHP necesitaba desesperadamente un estándar para el autocargador, que es como nació PSR-0. El último estándar de cargador automático aceptado es el PSR-4.

PSR-0 (estándar de carga automática)

Descripción general de PSR-0:

  • Un espacio de nombres y una clase completamente calificados deben tener la siguiente estructura
    \ <Nombre del proveedor> \ (<Espacio de nombre> \) * <Nombre de clase>
  • Cada espacio de nombres debe tener un espacio de nombres de nivel superior ("Nombre del proveedor").
  • Cada espacio de nombres puede tener tantos sub-espacios de nombres como desee.
  • Cada separador de espacio de nombres se convierte en un DIRECTORY_SEPARATOR cuando se carga desde el sistema de archivos.
  • Cada carácter _ en el NOMBRE DE LA CLASE se convierte en un DIRECTORIO_SEPARATOR. El carácter _ no tiene un significado especial en el espacio de nombres.
  • El espacio de nombres y la clase totalmente calificados tienen el sufijo .php cuando se cargan desde el sistema de archivos.
  • Los caracteres alfabéticos en los nombres de proveedores, espacios de nombres y nombres de clases pueden ser de cualquier combinación de minúsculas y mayúsculas.

Ejemplos:

\ Doctrine \ Common \ IsolatedClassLoader =>
/path/to/project/lib/vendor/Doctrine/Common/IsolatedClassLoader.php

\ Symfony \ Core \ Request =>
/ruta/to/proyecto/lib/vendor/Symfony/Core/Request.php

PSR-4 (estándar de carga automática)

Descripción general de PSR-4:

  • El término "clase" se refiere a clases, interfaces, rasgos y otras estructuras similares.
  • Un nombre de clase completamente calificado tiene la siguiente forma:
    \ <NombreEspacioNombre> (\ <NombresubNombreespacio>) * \ <NombreClase>
  • El nombre de clase completamente calificado DEBE tener un nombre de espacio de nombre de nivel superior, también conocido como "espacio de nombre de proveedor".
  • El nombre de clase completamente calificado PUEDE tener uno o más nombres de sub-espacio de nombres.
  • El nombre de clase completamente calificado DEBE tener un nombre de clase de terminación.
  • Los guiones bajos no tienen un significado especial en ninguna parte del nombre de clase completo.
  • Los caracteres alfabéticos en el nombre de clase completamente calificado PUEDEN ser cualquier combinación de minúsculas y mayúsculas.
  • Todos los nombres de clases DEBEN ser referenciados de manera sensible a mayúsculas y minúsculas.

Ejemplo de carga automática basada en PSR-4 con Composer:

  • Considere la siguiente estructura de directorio para lograr la carga automática basada en PSR-4 usando Composer.
psr_image6
  • Cree un archivo composer.json con composer init. De lo contrario, puede crear uno manualmente ahora en la raíz de su proyecto.
psr_image7
  • Configure la carga automática de PSR4 editando el archivo composer.json como se muestra a continuación:
psr_image8
  • Aquí, CodeCourse es un nombre de proveedor de su aplicación, puede usar este nombre mientras coloca archivos de espacio de nombres dentro de su directorio src, como por ejemplo:
    psr_image9

    O

psr_image10

etc,

  • Y src es el directorio de su aplicación que desea cargar automáticamente.
  • A continuación, abra su terminal y escriba el siguiente comando para instalar archivos de carga automática en su proyecto. Esto generará el directorio del proveedor y el archivo autoload.php dentro de él.
psr_image11
  • Primero creemos un par de clases dentro del directorio CodeCourse.

Cree AuthFilters.php dentro de CodeCourse / Filters

psr_image11

Cree UserRepository.php dentro de CodeCourse / Repositories

psr_image12
  • Finalmente, cree un archivo index.php para probarlo y necesita solicitar el archivo autoload.php una vez en su archivo index.php.
psr_image14

PSR-1 y PSR-2

PSR-1 y PSR-2 son útiles para los estándares de codificación PHP. PSR-1 se centra principalmente en el estándar de codificación básico para PHP, mientras que PSR-2 se parece más a una versión ampliada de PSR-1. El PSR-1 enumera un conjunto de reglas simples para las convenciones de nomenclatura y el PSR-2 proporciona una guía de estilo de codificación más completa.

PSR-1 (estándar de codificación básico)

Descripción general de PSR-1:

  • Solo se permiten <? Php o <? = Para las etiquetas PHP.
  • Los nombres de las clases deben definirse en UpperCamelCase.
  • Las variables de clase deben definirse en camelCase.
  • Las constantes de clase deben definirse en UPPER_SNAKE_CASE.
  • Los nombres de los métodos deben definirse en camelCase.
  • Los archivos DEBEN declarar símbolos (clases, funciones, constantes, etc.) o causar efectos secundarios (por ejemplo, generar resultados, cambiar la configuración de .ini, etc.) pero NO DEBEN hacer ambas cosas. Es decir,
psr_image15

El ejemplo anterior causa un efecto secundario, es decir, cargar un archivo llamado "file.php".

  • Los archivos deben estar en UTF-8 sin BOM (marca de orden de bytes).
  • Los espacios de nombres y los nombres de clases deben seguir los estándares de PSR-0 y PSR-4.

A continuación, se muestra un ejemplo que ilustra las convenciones de nomenclatura básicas para propiedades, clases y métodos.

psr_image16

PSR-2 (Guía de estilo de codificación)

Descripción general de PSR-2:

  • Debe seguir los estándares de codificación PSR-1.
  • Se deben usar 4 espacios para las sangrías. No se permite el uso de pestañas.
  • No hay límite para la longitud de la línea, pero debe tener menos de 120 caracteres y es mejor si tiene menos de 80.
  • Debe haber una línea en blanco después de la declaración del espacio de nombres y debe haber una línea en blanco después del bloque de declaración de uso.
  • Abrir llaves para clases y métodos debe ir en la línea siguiente y cerrar llaves debe ir en la línea después del cuerpo.
  • Los métodos y propiedades deben definirse con abstract / final primero, seguido de public / protected y, finalmente, static.
  • No debe poner una nueva línea antes de las llaves en las declaraciones condicionales.
  • No debe poner espacios antes (y) en declaraciones condicionales.
  • Un ejemplo para definir clases:
  • Debe abrir las llaves en la nueva línea y las palabras clave extend e implements deben usarse en una sola línea.
psr_image17

Si hay varias interfaces para implementar, puede escribir los nombres de las interfaces en la nueva línea como se muestra a continuación:

psr_image18

Ejemplo para mostrar cómo se definen los métodos en PHP:
Al definir los métodos, los argumentos deben escribirse en la misma línea. Además, no debe poner espacios en blanco antes de las comas en los argumentos, y debe poner un espacio en blanco después de ellos.

psr_image19

Si hay muchos argumentos, se pueden escribir en una nueva línea uno tras otro:

psr_image20

Al definir métodos, debe tener uno de público / protegido / privado y abstracto / final. Los modos de visibilidad vienen después de la palabra clave abstract / final, si se usa. static es el último modificador.

psr_image21

Declaraciones condicionales

  • Debes poner un espacio en blanco antes (
  • No debe poner espacios en blanco después de (
  • No debes poner espacios en blanco antes)
  • Debes poner un espacio en blanco después)
  • use elseif en lugar de else if.

Ejemplo para mostrar la diferencia entre elseif y else if:
Interpretación de elseif:

psr_image22

Interpretación de else si:

psr_image23

Para las declaraciones de cambio,

  • Las llaves deben abrirse en la misma línea donde está escrita la instrucción de cambio.
  • El cuerpo de la caja debe sangrarse una vez desde la caja y la caja debe tener una sangría una vez desde el interruptor.
  • No use ningún descanso cuando no sea necesario.
  • También puede usar return en lugar de break.

Ejemplo:

psr_image24