"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 자동 로더의 전투 : PSR-0 vs. PSR-4

자동 로더의 전투 : PSR-0 vs. PSR-4

2025-03-25에 게시되었습니다
검색:373

자동 로더의 전투 : PSR-0 vs. PSR-4

키 테이크 아웃

  • PSR-0 및 PSR-4는 PHP의 자동로드 표준이며, PSR-0은 클래스의 네임 스페이스를 기반으로 경로를 정의하고 클래스 이름의 밑줄을 허용하는 반면, PSR-4는 폴더 구조를 단순화하고 PSR-0의 잔여 물질을 제거하는 것을 목표로합니다.
  • PSR-4는 패키지 지향 자동 로딩이라고 불리며 클리너 패키지를 허용하지만 구현하기가 더 복잡합니다. 또한 Autoloader는 예외를 던지거나 오류를 제기해서는 안되며 여러 자동 로더와의 호환성을 유지해야합니다.
  • PSR-0과 PSR-4는 장단점을 가지고 있습니다. PSR-4는 더 간단한 폴더 구조를 허용하지만 완전히 자격을 갖춘 이름에서 클래스의 정확한 경로를 표시하지는 않지만 PSR-0은 혼란 스러울 수 있지만 구형 이름 지정 규칙을 사용하여 개발자를 지원하고 클래스를 찾는 데 도움이됩니다.
  • .

PHP 교육에서 초보자 단계를 지나간 경우 PSR-0에 대해 들었습니다. PSR-0에 대해 들었습니다. 즉, 요구 사항 및 포함과 같은 문장을 사용하지 않고도 코드에 PHP 클래스를 자동으로 포함시키는 방법을 정의하는 자동로드 표준입니다.

psr-0

PSR-0은 클래스의 네임 스페이스를보고 해당 정보에서 하드 드라이브의 위치를 ​​식별합니다. 예를 들어, 클래스 \ zend \ mail \ message는 /path/to/project/lib/vendor/zend/mail/message.php.=&& 설정으로 이어집니다.

PSR-0은 또한 클래스 이름의 밑줄을 대안으로 지원하여 5.2 이상에서 더 쉽게 전환 할 수 있도록합니다. zend_mail_message는 또한/path/to/project/lib/vendor/zend/mail/message.php.=&&]로 이어집니다.

작곡가

Composer가 나타나서 PHP 패키지 관리 세계를 폭풍으로 가져 갔을 때 상황이 바뀌 었습니다. 일부 규칙으로 인해 폴더는 종종 복제되어 Composer를 통해 PSR-0 클래스 설치를 볼 때 너무 깊어졌습니다. 예를 들어, 일부 폴더 구조는 다음과 같이 끝났습니다.

공급업체/ vendor_name/ package_name/ SRC/ vendor_name/ package_name/ classname.php # vendor_name \ package_name \ classname 테스트/ vendor_name/ package_name/ classnameTest.php # vendor_name \ package_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

"SRC"및 "Tests"디렉토리에는 공급 업체 및 패키지 디렉토리 이름을 포함해야합니다. 이것은 PSR-0 규정 준수의 아티팩트입니다.

따라서, 자격을 갖춘 PHP 개발자는 새로운 표준에 대한 제안을 모았습니다 : PSR-4.

psr-4

PSR-4는 필요한 경우 PSR-0과 함께 보완하고 협력하는 것을 목표로합니다. 가능하지만 필요하지 않습니다. PSR-4의 주요 목표는 PSR-0의 잔재와 5.3 일 이전의 잔재를 완전히 제거하고보다 간결한 폴더 구조를 허용하는 것입니다. PSR-4의 경우 위의 폴더 트리는 다음과 같습니다.

공급업체/ vendor_name/ package_name/ SRC/ classname.php # vendor_name \ package_name \ classname 테스트/ classnameTest.php # vendor_name \ package_name \ ClassnameTest

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

PSR-0은 클래스 이름의 모든 부분 사이의 중보 경로를 허용하지 않기 때문에

이것은 매우 중요합니다-이는 PSR-4를 구현하는 것이 더 깨끗한 패키지를 허용하지만 구현하기가 훨씬 더 복잡하다는 것을 의미합니다. 우리는 PSR-4 패키지 지향 자동 로딩을 호출합니다. 단순성 전에 패키지 청결을 선호하기 때문입니다.

선택한 접근 방식

제안 된 목표는 다음과 같습니다. PSR-0 규칙을 유지하면 모든 패키지가 최소한 두 개의 네임 스페이스 레벨 (공급 업체 및 패키지)을 포함해야한다는 말을 유지하고 공급 업체 패키지 콤보가 모든 폴더에 매핑 될 수 있고 공급 업체 패키지 콤보와 완전히 자격을 갖춘 클래스 이름의 폴더를 설치할 수 있는지 확인하십시오.

이것은 우리가 패키지 코드에 어디서나 수업을 인간으로서 우리에게 적합한 곳에서 어디서나 대체 하중 기술을 작성하거나 수동 로딩에 의존하지 않고도 PHP에서 여전히 원활하게 사용할 수 있다는 것을 의미합니다.

드래프트는 PSR-4 자동 로더가 예외를 던지지 않아야하거나 여러 오토 로더가 등록 될 수 있기 때문에 단순히 예외를 제외하지 않아야하거나 오류를 제기해서는 안되며, 클래스를로드하지 못하면 다른 사람들에게는 오류를 던지고 흐름을 중단해야합니다. 실패에 대한 추가 정보가 필요한 경우 PSR-3 호환 로거 또는 기타 임의의 수단을 사용해야합니다.

예제 파일에 표시된대로 PSR-4 자동 로더를 사용하여 다음 구조에서 클래스를로드합니다.

/path/to/packages/foo-bar/ SRC/ baz.php # foo \ bar \ baz qux/ quux.php # foo \ bar \ qux \ quux 테스트/ 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 // 로더를 인스턴스화합니다 $ loader = new \ example \ psr4autoloaderclass; // 자동 로더를 등록합니다 $ loader-> register (); // 네임 스페이스 접두사의 기본 디렉토리를 등록합니다 $ loader-> addnamespace ( 'foo \ bar', '/path/to/packages/foo-bar/src'); $ loader-> addnamespace ( 'foo \ bar', '/path/to/packages/foo-bar/tests');

새로운 \ foo \ bar \ qux \ quux를 호출하는 곳; New \ foo \ bar \ qux \ quuxtest; 두 번째로부터로드하려고 시도 할 것이다.
 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');
이 예제는 단일 네임 스페이스 당 여러 폴더의 사용을 보여줍니다.

결론

자동 로딩에는 은색 총알이 없습니다. 각 접근 방식은 그 자체로 몇 가지 장단점을 제공합니다-PSR-4는 더 간단한 폴더 구조를 허용하지만, 완전히 자격을 갖춘 이름을 보면 클래스의 정확한 경로를 알지 못하게합니다. 반면에 PSR-0은 하드 드라이브에서는 혼란 스럽지만 과거에 갇힌 개발자 (클래스의 이름이없는 사용자)를 지원하고 이름을 보면서 수업의 위치를 ​​분별하는 데 도움이됩니다.

PSR-4에 대해 어떻게 생각하십니까? 아래 의견에 알려 주거나 많은 토론 중 하나에서 귀하의 의견을 표현하십시오.

어느 쪽이든-패키지 지향 자동 로딩이 여기에 있다는 것은 의심의 여지가 없습니다. 공식적으로 표준으로 받아 들여지지 않으면 필요한 사람들이 사용자 정의를 구현합니다. 토론에 참여 하고이 공식적인 상태에 도달 할만 큼 충분히 개념을 개선하는 것은 우리에게 달려 있습니다.

PSR-0 및 PSR-4 자동 로딩에 대한 자주 묻는 질문

PSR-0과 PSR-4의 주요 차이점은 무엇입니까? PSR-0은 네임 스페이스와 디렉토리 구조 사이의 직접적인 상관 관계가 필요합니다. 즉, 네임 스페이스의 각 밑줄이 디렉토리 분리기에 해당합니다. 반면, PSR-4는 네임 스페이스의 일부를 디렉토리에 매핑 할 수 있고 나머지 네임 스페이스는 하위 디렉토리 구조에 매핑 될 수있는보다 유연한 접근법을 허용합니다.

PSR-0이 이미 제자리에있을 때 PSR-4가 소개 되었습니까? PSR-0의 네임 스페이스와 디렉토리 구조 사이의 엄격한 상관 관계는 깊게 중첩 된 디렉토리로 이어졌으며, 이는 항상 실용적이거나 효율적이지 않았습니다. PSR-4는보다 유연한 접근 방식을 제공하여 개발자가 디렉토리에 네임 스페이스를 맵핑하여 깊은 디렉토리 중첩의 필요성을 줄일 수 있습니다.

동일한 프로젝트에서 PSR-0과 PSR-4를 모두 사용할 수 있습니까? 그러나 동일한 클래스를 자동로드하는 데 사용해서는 안된다는 점에 유의해야합니다. 두 표준을 사용하면 일부 레거시 코드가 PSR-0 표준을 따르는 대규모 프로젝트에서 유리할 수 있으며, 최신 코드는 PSR-4 표준을 따릅니다.

PSR-4는 자동로드에 대한 융통성있는 접근 방식을 제공함으로써 PSR-0에서 개선됩니다. 이를 통해 개발자는 네임 스페이스의 일부를 모든 디렉토리에 매핑하여 깊은 디렉토리 중첩의 필요성을 줄일 수 있습니다. 이로 인해 프로젝트의 디렉토리 구조를보다 쉽게 ​​관리하고 탐색 할 수 있습니다.

는 psr-0 이상이 감가 상각 되나요? 이것은 여전히 ​​기능적이지만 새로운 프로젝트에 사용하는 것이 권장되지 않음을 의미합니다. PSR-4는 php에서 자동로드하는 데 권장되는 표준입니다.

PSR-4에서 자동로드가 어떻게 작동합니까? 그런 다음 나머지 네임 스페이스는 하위 디렉토리 구조에 매핑됩니다. 이를 통해 자동로드에 대한보다 유연하고 효율적인 접근 방식이 가능합니다.

PSR-4를 사용하는 것의 이점은 무엇입니까?

PSR-4는 자동로드에 대한보다 유연한 접근 방식, 깊은 디렉토리 중첩에 대한 요구 감소 및 개선 된 효율성을 포함하여 몇 가지 이점을 제공합니다. 또한 PHP의 자동로드에 권장되는 표준이므로 새로운 프로젝트에 적합한 선택입니다.

어떻게 PSR-0에서 PSR-4로 마이그레이션 할 수 있습니까? PSR-4에서는 네임 스페이스의 일부를 디렉토리에 매핑 할 수 있고 나머지 네임 스페이스는 하위 디렉토리 구조에 매핑 될 수 있습니다. 이를 위해서는 프로젝트 디렉토리 구조를 재구성해야 할 수 있습니다.

이전 PHP 버전에서 PSR-4를 사용할 수 있습니까? 이전 버전의 PHP를 사용하는 경우 PSR-4를 사용하기 위해 업그레이드해야합니다.

PHP에서 자동로드의 미래는 무엇입니까?

PHP의 미래는 계속 발전하고 있으며, 새로운 표준과 사례는 언어로 도입 될 가능성이 높으며 생태계는 EcoSystem이 발전 할 가능성이 높습니다. 그러나 가까운 미래에 PSR-4는 Php에서 자동로드에 권장되는 표준입니다.

최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3