Paquetes de composición, carga automática de archivos no basados en clases
Cuando estaba cavando en la fuente de un paquete de Composeren github Me di cuenta de que habíaarchivos php que coinciden con los nombres de espacio de nombres pero fueron precedidos con un guión bajo. Desconcertado, bajé el paquete (a través de Composer) y noté que el cargador de clases que Composer generarequire
Estos archivos subrayados explícitamente, no se cargan automáticamente como esperaba.
Por ejemplo, en elcrunch/regular-expression
paquete hay un espacio de nombres llamadoCrunch\RegularExpression
:
-- src
---- Crunch
------- RegularExpression <-- folder containing classes
------- _RegularExpression.php <-- file namespace to Crunch/RegularExpression
containing functions and constants
(instead of a class)
Inicialmente pensé que estos archivos subrayados eran una característica del PSR-0 que había perdido, pero luego miré el Composer generado.autoload_real.php
y vi que_RegularExpression.php
(entre otros) se requería explícitamente:
…
$loader->register(true);
require $baseDir . '/src/Crunch/_RegularExpression.php';
require $baseDir . '/src/Crunch/RegularExpression/_Modifier.php';
require $baseDir . '/src/Crunch/RegularExpression/Pattern/_Modifier.php';
require $baseDir . '/src/Crunch/RegularExpression/Pattern/_Assertion.php';
return $loader;
…
No he podido encontrar ninguna documentación significativa sobre esta función de Composer. ¿Es un buen "estándar" para exportar dependencias de espacio de nombres no basadas en clases, como funciones y constantes?
ActualizarMi pregunta resultó ser un nombre poco apropiado. La respuesta seleccionada me lleva a descubrir que los activos no basados en clases se pueden declarar explícitamente para cargarcomposer.json
:
"autoload": {
"psr-0": { "Crunch\\RegularExpression": "src" },
"files": [
"src/Crunch/_RegularExpression.php",
"src/Crunch/RegularExpression/_Modifier.php",
"src/Crunch/RegularExpression/Pattern/_Modifier.php",
"src/Crunch/RegularExpression/Pattern/_Assertion.php"
]
}
Los guiones bajos en los archivos fueron una convención utilizada para delinearlos de las definiciones de clase y no tienen ningún propósito especial en la carga automática.