php - estandar - psr-4 composer
¿Cuál es la diferencia entre PSR-0 y PSR-4? (4)
Espacio de nombres / convención de carpeta.
- Las clases se deben almacenar en carpetas de acuerdo con sus espacios de nombres.
- En general, creará un directorio src / en su carpeta raíz, sentado al mismo nivel que vendor /, y agregue sus proyectos allí. A continuación se muestra un ejemplo de estructura de carpetas.
Diferencia entre psr-0 y psr-4
psr-0
Está en desuso. Al mirar el archivo vendor/composer/autoload_namespaces.php
, puede ver los espacios de nombres y los directorios a los que están asignados.
composer.json
"autoload": {
"psr-0": {
"Book//": "src/",
"Vehicle//": "src/"
}
}
- Buscando Book / History / UnitedStates en src / Book / History / UnitedStates.php
- Buscando Vehicle / Air / Wings / Airplane en src / Vehicle / Air / Wings / Airplane.php
psr-4
Al mirar el archivo vendor/composer/autoload_psr4.php
, puede ver los espacios de nombres y los directorios a los que están asignados.
composer.json
"autoload": {
"psr-4": {
"Book//": "src/",
"Vehicle//": "src/"
}
}
- Buscando Book / History / UnitedStates en src /History/UnitedStates.php
- Buscando Vehicle / Air / Wings / Airplane en src / Air / Wings / Airplane.php
composer.json
"autoload": {
"psr-4": {
"Book//": "src/Book/",
"Vehicle//": "src/Vehicle/"
}
}
- Buscando Book / History / UnitedStates src / Book /History/UnitedStates.php
- Buscando Vehicle / Air / Wings / Airplane en src / Vehicle / Air / Wings / Airplane.php
Recientemente leí sobre espacios de nombres y cómo son beneficiosos.
Estoy creando un proyecto en Laravel y estaba tratando de pasar de la carga automática de mapas de clase al espacio de nombres.
Parece que no puedo entender cuál es la diferencia real entre PSR-0 y PSR-4. Algunos recursos de los que he leído son
Lo que yo entiendo:
- PSR-4 no convierte caracteres de subrayado en separadores de directorios
- Ciertas reglas específicas del compositor hacen que la estructura del directorio se vuelva compleja, lo que a su vez hace que el espacio de nombres de PSR-0 sea detallado y, por lo tanto, se creó el PSR-4.
Se agradecerán los ejemplos que explican la diferencia.
Estas son las principales diferencias,
1. Por ejemplo, si define que el espacio de nombres Acme/Foo/
está anclado en src/
,
- con PSR-0 significa que buscará
Acme/Foo/Bar
ensrc/Acme/Foo/Bar.php
- mientras que en PSR-4 buscará
Acme/Foo/Bar
ensrc/Bar.php(where Bar class is)
.
2. PSR-4 no convierte caracteres de subrayado en separadores de directorios
3. Preferiría usar PSR-4 con espacios de nombres
4. PSR-0 no funcionará aunque el nombre de la clase sea diferente del nombre del archivo, como en el ejemplo anterior:
-
Acme/Foo/Bar
--->src/Acme/Foo/Bar.php
(para la clase de Bar) funcionará -
Acme/Foo/Bar
--->src/Acme/Foo/Bar2.php
(para la clase de Bar) no funcionará
PSR-4 es algo así como ''ruta relativa'', PSR-0, ''ruta absoluta''.
p.ej
config:
''App/Controller'' => ''dir/''
PSR-0 autocarga:
App/Controller/IndexController --> dir/App/Controller/IndexController.php
PSR-4 autocarga:
App/Controller/IndexController --> dir/IndexController.php
Y hay más diferencias en los detalles entre PSR-0 y PSR-4, consulte aquí: PSR-4
Son muy similares, así que no es sorprendente que sea un poco confuso. El resumen es que PSR-0 tenía algunas características de compatibilidad con versiones anteriores para los nombres de clase PEAR que PSR-4 eliminó, por lo que solo es compatible con el código de espacio de nombres. Además de eso, el PSR-4 no lo obliga a tener todo el espacio de nombres como una estructura de directorio, sino solo a la parte que sigue al punto de anclaje.
Por ejemplo, si define que el espacio de nombres Acme/Foo/
está anclado en src/
, con PSR-0 significa que buscará Acme/Foo/Bar
en src/Acme/Foo/Bar.php
mientras que en PSR-4 lo hará búsquelo en src/Bar.php
, permitiendo estructuras de directorios más cortas. Por otro lado, algunos prefieren tener la estructura de directorios completa para ver claramente en qué espacio de nombres, por lo que también se puede decir que Acme/Foo/
está en src/Acme/Foo
con PSR-4, que le dará el equivalente del Comportamiento de PSR-0 descrito anteriormente.
Larga historia para nuevos proyectos y para la mayoría de los propósitos, puede usar PSR-4 y olvidarse todo sobre PSR-0.