¿Cómo nombrar archivos de clases con espacios de nombres?

9

Manual de WP Core> Estándares de codificación PHP> Convenciones de nomenclatura sugiere lo siguiente para nombrar archivos con clases:

Los nombres de los archivos de clase deben basarse en el nombre de la clase con class- antepuestos y los guiones bajos en el nombre de la clase reemplazados por guiones, por ejemplo, se WP_Errorconvierten en:

class-wp-error.php

Si bien la redacción de la sección está destinada principalmente al uso principal , el estilo de codificación en general se aplica (y en mi opinión) se aplica al código WP de terceros.

Sin embargo, dado que el núcleo no admite espacios de nombres (PHP 5.2, ugh), este no es el caso.

¿Cuál es la forma práctica de hacerlo desde la perspectiva de la conveniencia del desarrollador? ¿Soporte de cargadores automáticos?

Pude ver múltiples formas alternativas:

  • ignorando el espacio de nombres por completo
  • incluyendo espacio de nombres en el nombre del archivo
  • usando espacios de nombres como niveles de carpeta
  • usando un esquema de nombres alternativo por completo, como PSR
Rarst
fuente
3
Mi opinión sincera es que si usa PHP 5.3+ ya está violando las reglas básicas de WP. Además, tenga en cuenta que los estándares de WP no tienen en cuenta las interfaces o los rasgos. Entonces, para mí, tiene sentido elegir una forma que sea conveniente para usted y usar un estándar ya establecido como PSR parece una mejor opción en ese caso.
gmazzap

Respuestas:

7

Primero, ignore el class-prefijo. Esto proviene del enfoque de código de procedimiento puro de WordPress, las clases se usan como contenedores para código de procedimiento, no para objetos reales, y la mayoría de los archivos no contienen clases en absoluto o clases y otro código juntos. No tiene sentido cuando todos sus archivos contienen solo una clase y nada más.
Si siguieras ese patrón, tendrías que usar interface-foo.phpy trait-bar.php. Eso no solo parece ridículo, sino que hace que la carga automática sea más difícil de lo necesario.

La forma más fácil de separar los espacios de nombres y los nombres de clase / interfaz / rasgo es (según mi experiencia) asignando espacios de nombres a nombres de directorio y nombres de clases a nombres de archivo. Esto hace que sea muy fácil para asignar la clase solicitada a una estructura de archivo dado en el cargador automático: Sólo convertir \a /, append .phpy cargue el archivo.

Esto también facilita el almacenamiento en caché de las búsquedas: para cada directorio / espacio de nombres, puede buscar todos los archivos existentes la primera vez que se solicita ese directorio, y para llamadas posteriores puede tomar la reutilización de esa lista de nombres de archivos sin preguntar file_exists()cada vez .

fuxia
fuente
44
En otras palabras: hacerlo compatible con PSR :)
kaiser
2

He hecho una clase para este requisito, compatible con PSR-4 y siguiendo los estándares de codificación de Wordpress.

Puede llegar aquí: https://github.com/pablo-pacheco/wp-namespace-autoloader

La explicación está ahí, pero básicamente es una dependencia del compositor. Solo tienes que requerirlo en tu proyecto:

"require": {    
    "pablo-pacheco/wp-namespace-autoloader": "dev-master"
}

Y luego llama a la clase

<?php
new \WP_Namespace_Autoloader( array(    
    'directory'   => __DIR__,       // Directory of your project. It can be your theme or plugin. __DIR__ is probably your best bet.    
    'namespace'   => __NAMESPACE__, // Main namespace of your project. E.g My_Project\Admin\Tests should be My_Project. Probably if you just pass the constant __NAMESPACE__ it should work     
    'classes_dir' => 'src',         // (optional). It is where your namespaced classes are located inside your project. If your classes are in the root level, leave this empty. If they are located on 'src' folder, write 'src' here 
) );
Pablo SG Pacheco
fuente
1

Generalmente voy con la segunda mitad de sus opciones:

  • usando espacios de nombres como niveles de carpeta
  • usando un esquema de nombres alternativo por completo, como PSR

Si usa Composer para registrar un autocargador PSR-4, puede mantenerse cerca de las convenciones de nomenclatura de WP. Los espacios de nombres asignados a carpetas que pueden contener guiones bajos con archivos denominados como la clase que también pueden contener guiones bajos. Me gusta:

<Namespace_Dir>/Class_Name.php

Cuando WP pasa a php 5.3+ (tiene que suceder eventualmente, ¿no?) Las pautas deben actualizarse. Dado que PSR-0 ya está en desuso, se debe recomendar al menos PSR-4 si no es necesario.

cfoellmann
fuente
0

La solución de pablo-sg-pacheco funcionó para mí, cargando automáticamente confiando en el compositor pero compatible con los estándares de codificación de WordPress, sin embargo, la url para el repositorio de Github es:

https://github.com/pablo-sg-pacheco/wp-namespace-autoloader

y el nombre del paquete es:

"require": {    
    "pablo-sg-pacheco/wp-namespace-autoloader": "dev-master"
}

Finalmente, también deberá agregar lo siguiente a su composer.json porque el paquete no está disponible en packagist:

"repositories": [{
    "type": "vcs",
    "url": "https://github.com/pablo-sg-pacheco/wp-namespace-autoloader"
}] 
guillaume.molter
fuente