"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > Battle of the Autoloaders: PSR-0 vs. PSR-4

Battle of the Autoloaders: PSR-0 vs. PSR-4

Publicado el 2025-03-25
Navegar:427

Battle of the Autoloaders: PSR-0 vs. PSR-4

Key Takeaways

  • PSR-0 y PSR-4 son estándares de carga automática en PHP, con PSR-0 definiendo rutas basadas en el espacio de nombres de una clase y permitiendo subrayos en los nombres de clases, mientras que PSR-4 tiene como objetivo simplificar la estructura de la carpeta y eliminar los restos de PSR-0.
  • PSR-4, denominado AutorAding orientado a paquetes, permite paquetes más limpios pero es más complicado de implementar. También garantiza que los autocomolabables nunca deberían arrojar excepciones o aumentar los errores, manteniendo la compatibilidad con múltiples autoloaders.
  • Tanto PSR-0 como PSR-4 tienen sus pros y contras: PSR-4 permite estructuras de carpetas más simples, pero no muestra la ruta exacta de una clase de su nombre totalmente calificado, mientras que PSR-0 puede ser caótico, pero admite desarrolladores que usan convenciones de nombres más antiguas y ayudas para localizar una clase de su nombre.

Si ha superado la etapa principiante en su capacitación PHP, ha oído hablar de PSR-0, un estándar de carga automática que define formas de incluir automáticamente las clases de PHP en su código sin tener que usar declaraciones como Request e incluir.

psr-0

PSR-0 mira el espacio de nombres de una clase y discierna su ubicación en el disco duro de ese poco de información. Por ejemplo, la clase \ zend \ mail \ mensaje conduciría a /path/to/project/lib/vendor/zend/mail/message.php.che&&&]

PSR-0 también admite subrayos en los nombres de clases como una alternativa, para facilitar la transición de 5.2 y antes. Zend_mail_message también conduciría a /path/to/project/lib/vendor/zend/mail/message.php.che&&&]

Compositor

Cuando el compositor apareció y tomó el mundo de la gestión de paquetes PHP por asalto, las cosas cambiaron. Debido a algunas de sus reglas, las carpetas a menudo duplicadas y se volvieron demasiado profundas al mirar las instalaciones de la clase PSR-0 a través del compositor. Por ejemplo, algunas estructuras de carpetas terminaron así:

proveedor/ vendor_name/ paquete_name/ SRC/ Vendor_name/ Paquete_name/ Classname.php # Vendor_name \ Packack_name \ classname pruebas/ Vendor_name/ Paquete_name/ ClassNametest.php # Vendor_name \ Packack_name \ ClassNametest

vendor/
    vendor_name/
        package_name/
            src/
                Vendor_Name/
                    Package_Name/
                        ClassName.php       # Vendor_Name\Package_Name\ClassName
            tests/
                Vendor_Name/
                    Package_Name/
                        ClassNameTest.php   # Vendor_Name\Package_Name\ClassNameTest

Los directorios "SRC" y "Pruebas" deben incluir nombres de directorio de proveedores y paquetes. Este es un artefacto de cumplimiento de PSR-0.

Por lo tanto, algunos desarrolladores de PHP altamente calificados se reunieron y organizan una sugerencia para un nuevo estándar: PSR-4.

psr-4

PSR-4 tiene como objetivo complementar y trabajar junto con PSR-0 cuando sea necesario, no reemplazarlo por completo. Puede, pero no tiene que hacerlo. El objetivo principal de PSR-4 es eliminar los restos de PSR-0 y los días anteriores a 5.3 por completo, y permitir una estructura de carpeta más concisa. Con PSR-4, el árbol de carpetas anterior se vería así:

proveedor/ vendor_name/ paquete_name/ SRC/ Classname.php # Vendor_name \ Packack_name \ classname pruebas/ ClassNametest.php # Vendor_name \ Packack_name \ ClassNametest

vendor/
    vendor_name/
        package_name/
            src/
                ClassName.php       # Vendor_Name\Package_Name\ClassName
            tests/
                ClassNameTest.php   # Vendor_Name\Package_Name\ClassNameTest

porque PSR-0 no permite una ruta intercesiva entre ninguna parte del nombre de clase

Esto es muy importante: significa que la implementación de PSR-4, al tiempo que permite implementar paquetes mucho más limpios, sería mucho más complicado de implementar. Llamamos a PSR-4 orientado a los paquetes de autogestionamiento, porque favorece la limpieza del paquete antes de la simplicidad.

el enfoque elegido

Los objetivos sugeridos son los siguientes: Mantenga la regla PSR-0 que todos los paquetes deben contener al menos dos niveles de espacio de nombres (proveedor y paquete), asegúrese de que el combo de paquetes de proveedor pueda asignar a cualquier carpeta y permitir una infijo de carpetas entre el combo de paquetes de proveedor y el descanso del nombre de clase completamente calificado

]

Esto significa que podríamos poner nuestras clases en cualquier parte del código de paquete donde tenga sentido para nosotros como humanos, y aún usarlas sin problemas en PHP sin escribir técnicas de carga alternativa o recurrir a la carga manual.

además, el borrador establece explícitamente que un Autoloader de PSR-4 nunca debe arrojar excepciones ni aumentar errores simplemente porque se pueden registrar múltiples autoloaders, y si uno no puede cargar una clase, otros deberían tener la oportunidad de hacerlo, arrojando un error y detener el flujo rompe esta compatibilidad. Si se requiere información adicional sobre la falla, uno debe usar un registrador compatible con PSR-3 u otros medios arbitrarios.

como se ilustra en el archivo de ejemplo, usando el Autoloader PSR-4 para cargar clases de la siguiente estructura:

/path/to/paquetes/foo-bar/ SRC/ Baz.php # foo \ bar \ baz Qux/ Quux.php # foo \ bar \ qux \ quux pruebas/ Baztest.php # foo \ bar \ baztest Qux/ Quuxtest.php # foo \ bar \ qux \ quuxtest

      /path/to/packages/foo-bar/
          src/
              Baz.php             # Foo\Bar\Baz
              Qux/
                  Quux.php        # Foo\Bar\Qux\Quux
          tests/
              BazTest.php         # Foo\Bar\BazTest
              Qux/
                  QuuxTest.php    # Foo\Bar\Qux\QuuxTest

Php // instanciar el cargador $ loader = new \ Ejemplo \ PSR4AUTOTOLOADERClass; // Registre el Autoloader $ loader-> registrar (); // Registre los directorios base para el prefijo del espacio de nombres $ loader-> addnamespace ('foo \ bar', '/rath/to/paquete/foo-bar/src'); $ loader-> addnamespace ('foo \ bar', '/rath/to/paquete/foo-bar/tests');

 register();

    // register the base directories for the namespace    prefix
    $loader->addNamespace('Foo\Bar', '/path/to/packages/foo-bar/src');
    $loader->addNamespace('Foo\Bar', '/path/to/packages/foo-bar/tests');

Este ejemplo también ilustra el uso de múltiples carpetas por espacio de nombres único.

Conclusión

no hay una bala de plata en el autoenigencia. Cada enfoque trae consigo mismo algunos pros y contras: PSR-4 permitiría estructuras de carpetas más simples, pero nos impediría conocer la ruta exacta de una clase simplemente mirando el nombre totalmente calificado. PSR-0, por otro lado, es caótico en el disco duro, pero admite desarrolladores que están atrapados en el pasado (los usuarios de nombre de clase inferior) y nos ayudan a discernir la ubicación de una clase con solo mirar su nombre.

¿Cómo te sientes acerca de PSR-4? Háganos saber en los comentarios a continuación, o exprese su opinión en uno de los muchos debates.

de cualquier manera: no hay duda de que se está quedando autocruzizado por paquetes aquí para quedarse. Si no se acepta formalmente como estándar, entonces personalizado implementada por personas que lo necesitan. Depende de nosotros unirnos a la discusión y mejorar la noción lo suficiente como para llegar a este estado formal.

Preguntas frecuentes sobre PSR-0 y PSR-4 Autoloading

¿Cuál es la principal diferencia entre PSR-0 y PSR-4?

La principal diferencia entre PSR-0 y PSR-4 se encuentra en la forma en que manejan espacios de nombres y estructura de directorio. PSR-0 requiere una correlación directa entre los espacios de nombres y la estructura del directorio, lo que significa que cada subrayado en el espacio de nombres corresponde a un separador de directorio. Por otro lado, PSR-4 permite un enfoque más flexible, donde una parte del espacio de nombres se puede asignar a cualquier directorio, y el resto del espacio de nombres se puede asignar a la estructura del subdirectorio.

¿por qué PSR-4 introdujo cuando PSR-0 ya estaba? La estricta correlación de PSR-0 entre los espacios de nombres y la estructura del directorio condujo a directorios profundamente anidados, que no siempre fue práctico o eficiente. PSR-4 proporciona un enfoque más flexible, que permite a los desarrolladores mapear espacios de nombres a cualquier directorio, reduciendo la necesidad de anidación de directorio profundo.

¿Puedo usar PSR-0 y PSR-4 en el mismo proyecto?

sí, es posible usar PSR-0 y PSR-4 en el mismo proyecto. Sin embargo, es importante tener en cuenta que no deben usarse para que se encuentren a husil las mismas clases. El uso de ambos estándares puede ser beneficioso en grandes proyectos donde algún código heredado sigue el estándar PSR-0, mientras que el código más nuevo sigue el estándar PSR-4.

¿Cómo mejora PSR-4? Permite a los desarrolladores mapear una parte del espacio de nombres a cualquier directorio, reduciendo la necesidad de anidarse de directorio profundo. Esto facilita la gestión y navegación de la estructura del directorio del proyecto.

está en desuso? Esto significa que si bien todavía es funcional, no se recomienda su uso en nuevos proyectos. PSR-4 es el estándar recomendado para la autoinforme en php.

¿Cómo funciona el autoloading en PSR-4?

en PSR-4, trabajos de autolaading al asignar una parte del espacio de nombres a cualquier directorio. El resto del espacio de nombres se asigna a la estructura subdirectorio. Esto permite un enfoque más flexible y eficiente para la autoinforme.

¿Cuáles son los beneficios de usar PSR-4?

PSR-4 ofrece varios beneficios, incluido un enfoque más flexible para el autoenvergamento, la necesidad reducida de la anidación profunda de los directorio y la eficiencia mejorada. También es el estándar recomendado para la autoinformación en PHP, por lo que es una buena opción para nuevos proyectos.

¿Cómo puedo migrar de PSR-0 a PSR-4?

migrando de PSR-0 a PSR-4 implica cambiar los espacios de nombres de forma y los directorios se mapean. En PSR-4, una parte del espacio de nombres se puede asignar a cualquier directorio, y el resto del espacio de nombres se puede asignar a la estructura del subdirectorio. Esto puede requerir reestructurar la estructura del directorio de su proyecto.

¿Puedo usar PSR-4 en versiones PHP más antiguas?

PSR-4 requiere PHP 5.3 o posterior. Si está utilizando una versión anterior de PHP, deberá actualizar para usar PSR-4.

¿Cuál es el futuro de la carga automática en PHP?

El futuro de la autoinformación en PHP es probable que continúe evolucionando, con nuevos estándares y prácticas introducidas como el lenguaje y su ecosistema evolucionar. Sin embargo, en el futuro previsible, PSR-4 es el estándar recomendado para la autoadeading en Php.

Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3