Recientemente he leído sobre espacios de nombres y cómo son beneficiosos. Actualmente estoy creando un proyecto en Laravel e intento pasar de la carga automática del mapa de clase al espacio de nombres. Sin embargo, parece que no puedo entender cuál es la diferencia real entre PSR-0 y PSR-4.
Algunos recursos que he leído son ...
Lo que yo entiendo:
- PSR-4 no convierte guiones bajos en separadores de directorio
- Ciertas reglas específicas del compositor hacen que la estructura de directorios se vuelva compleja, lo que a su vez hace que el espacio de nombres PSR-0 sea detallado y, por lo tanto, se creó PSR-4
Se agradecerán ejemplos que expliquen la diferencia.
Respuestas:
Son muy similares, por lo 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 de estilo PEAR que PSR-4 descartó, por lo que solo admite código de espacio de nombres. Además de eso, PSR-4 no te obliga a tener todo el espacio de nombres como una estructura de directorio, sino solo la parte que sigue al punto de anclaje.
Por ejemplo si se define que el
Acme\Foo\
espacio de nombres está anclado ensrc/
, con PSR-0 que significa que buscaráAcme\Foo\Bar
ensrc/Acme/Foo/Bar.php
mientras que en PSR-4 que lo buscará ensrc/Bar.php
, teniendo en cuenta las estructuras de directorios más cortos. Por otro lado, algunos prefieren tener la estructura de directorio completa para ver claramente en qué espacio de nombres, por lo que también puede decir queAcme\Foo\
está ensrc/Acme/Foo
PSR-4, lo que le dará el equivalente del comportamiento de PSR-0 descrito anteriormente.Larga historia corta para nuevos proyectos y para la mayoría de las intenciones y propósitos, puede usar PSR-4 y olvidarse de PSR-0.
fuente
src/Bar.php
si usted diceAcme\Foo\ => src/
Aquí están las principales diferencias,
1. Por ejemplo, si define que el
Acme\Foo\
espacio de nombres está ancladosrc/
,Acme\Foo\Bar
ensrc/Acme/Foo/Bar.php
Acme\Foo\Bar
ensrc/Bar.php(where Bar class is)
.2. PSR-4 no convierte guiones bajos en separadores de directorio
3. Preferiría usar PSR-4 con espacios de nombres
4. PSR-0 no funcionará incluso si el nombre de la clase es diferente del nombre del archivo, como considerar el ejemplo anterior:
Acme\Foo\Bar
--->src/Acme/Foo/Bar.php
(para la clase Bar) funcionaráAcme\Foo\Bar
--->src/Acme/Foo/Bar2.php
(para la clase Bar) no funcionaráfuente
PSR-4 es algo así como 'ruta relativa', PSR-0, 'ruta absoluta'.
p.ej
config:
Carga automática de PSR-0 :
Carga automática de PSR-4 :
Y hay algunas diferencias más en los detalles entre PSR-0 y PSR-4, vea aquí: http://www.php-fig.org/psr/psr-4/
fuente
Convención de espacio de nombres / carpeta.
Las clases deben almacenarse en carpetas de acuerdo con sus espacios de nombres.
En general, creará un directorio src / en su carpeta raíz, al mismo nivel que el proveedor /, y agregará sus proyectos allí. A continuación se muestra un ejemplo de la estructura de carpetas:
Diferencia entre psr-0 y psr-4
psr-0
Está en desuso. Mirando el
vendor/composer/autoload_namespaces.php
archivo puede ver los espacios de nombres y los directorios a los que están asignados.composer.json
psr-4
Mirando el
vendor/composer/autoload_psr4.php
archivo puede ver los espacios de nombres y los directorios a los que están asignados.composer.json
composer.json
fuente
Incluso cuando lo intenté, pero Composer es un desastre. Lamentablemente, es la única alternativa del mercado.
¿Por qué es un desastre?
El autocompletado del Compositor funciona bien si usted tiene el control del código. Sin embargo, si está importando un proyecto diferente, encontrará muchos estilos y formas de crear carpetas. Por ejemplo, algunos proyectos son /company/src/class.php mientras que otros son company / class.php y otros son company / src / class / class.php
Creé una biblioteca que lo resuelve:
https://github.com/EFTEC/AutoLoadOne (es gratis, MIT).
Genera una inclusión automática al escanear todas las clases de una carpeta, por lo que funciona en todos los casos (psr-0 psr-4, clases sin espacio de nombres, archivo con múltiples clases ...
editar: Y nuevamente, rechazado sin ningún motivo. ;-)
fuente