programing

PSR-0과 PSR-4의 차이점은 무엇입니까?

prostudy 2022. 9. 12. 11:08
반응형

PSR-0과 PSR-4의 차이점은 무엇입니까?

최근에 나는 네임스페이스에 대해 읽고 그것들이 어떻게 도움이 되는지에 대해 읽었다.저는 현재 라라벨에서 프로젝트를 만들고 있으며 클래스 맵 자동 로딩에서 네임스페이스로 전환하려고 합니다.다만, PSR-0과 PSR-4의 실제 차이는 알 수 없는 것 같습니다.

제가 읽은 자료는...

이해한 내용:

  • PSR-4는 밑줄을 디렉토리 구분자로 변환하지 않습니다.
  • 특정 컴포넌트 규칙에 따라 디렉토리 구조가 복잡해져 PSR-0 네임스페이스가 상세하게 되어 PSR-4가 작성되었습니다.

예를 들어 차이점을 설명해 주시면 감사하겠습니다.

그들은 매우 비슷하기 때문에 그것이 조금 혼란스러운 것은 놀랄 일이 아니다.요약하면 PSR-0에는 PSR-4가 폐기한 PEAR 스타일의 클래스명에 대한 하위 호환성 기능이 몇 가지 있기 때문에 이름 지정 코드만 지원한다는 것입니다.게다가 PSR-4 에서는, 디렉토리 구조로서 이름 공간 전체를 강제적으로 가지는 것이 아니고, 앵커 포인트에 이은 부분만을 강제합니다.

예를 들어 다음과 같이 정의하면Acme\Foo\네임스페이스가 고정됨src/PSR-0의 경우, 이 제품은Acme\Foo\Barsrc/Acme/Foo/Bar.phpPSR-4에서는 그것을 찾습니다.src/Bar.php디렉토리 구조를 단축할 수 있습니다.한편, 일부에서는, 어느 네임스페이스에 무엇이 있는지를 명확하게 확인할 수 있는 완전한 디렉토리 구조를 선호합니다.따라서, 다음과 같이 말할 수도 있습니다.Acme\Foo\src/Acme/Foo위의 PSR-0 동작과 동등한 기능을 제공합니다.

줄여서 말하면 새로운 프로젝트나 대부분의 경우 PSR-4를 사용하면 PSR-0에 대한 모든 것을 잊어버릴 수 있습니다.

다음은 주요 차이점입니다.

1. 예를 들어 다음과 같이 정의하면Acme\Foo\네임스페이스가 고정됨src/,

  • PSR-0의 경우, 이것은, 다음의 기능을 필요로 하는 것을 의미합니다.Acme\Foo\Barsrc/Acme/Foo/Bar.php
  • PSR-4에서는, 다음의 정보를 검색합니다.Acme\Foo\Barsrc/Bar.php(where Bar class is).

2. PSR-4는 밑줄을 디렉토리 구분자로 변환하지 않는다

3. 네임스페이스와 함께 PSR-4를 사용하는 것이 좋습니다.

4. 위의 예시와 같이 클래스명이 파일명과 다른 경우에도 PSR-0은 동작하지 않습니다.

  • Acme\Foo\Bar--->src/Acme/Foo/Bar.php(Bar class의 경우)가 동작합니다.
  • Acme\Foo\Bar--->src/Acme/Foo/Bar2.phpclass의 가하지 않습니다.

PSR-4는 '상대 경로', PSR-0, '절대 경로'와 같은 것입니다.

예.

설정:

'App\Controller' => 'dir/'

PSR-0 자동 로드:

App\Controller\IndexController --> dir/App/Controller/IndexController.php

PSR-4 자동 로드:

App\Controller\IndexController --> dir/IndexController.php

또, PSR-0 와 PSR-4 의 상세한 것에 대하여는, 다음의 URL 를 참조해 주세요.http://www.php-fig.org/psr/psr-4/

네임스페이스/폴더 규칙입니다.

클래스는 네임스페이스에 따라 폴더에 저장해야 합니다.

일반적으로 루트 폴더에 src/ 디렉토리를 생성하여 벤더/와 같은 레벨에 배치하고 프로젝트를 추가합니다.폴더 구조의 예를 다음에 나타냅니다.

.
+-- src
    |
    +-- Book 
    |   +-- History
    |   |   +-- UnitedStates.php - namespace Book\History;
    +-- Vehicle
    |   +-- Air
    |   |   +-- Wings
    |   |   |   +-- Airplane.php - namespace Vehicle\Air\Wings;
    |   +-- Road
    |   |   +-- Car.php - namespace Vehicle\Road;
+-- tests
    +-- test.php
+-- vendor

psr-0과 psr-4의 차이점

PSR-0

권장되지 않습니다. 있습니다.vendor/composer/autoload_namespaces.php파일에서는 네임스페이스와 네임스페이스가 매핑된 디렉토리를 볼 수 있습니다.

composer.json

"autoload": {
        "psr-0": {
            "Book\\": "src/",
            "Vehicle\\": "src/"
        }
} 
  • 찾는 중\이력\미국(src/Book/History/United States)php
  • 차량 검색 중\src/Vehicle/Air/Wings/Airplane의 Air\Wings\Airplane.php

PSR-4

있습니다.vendor/composer/autoload_psr4.php파일에서는 네임스페이스와 네임스페이스가 매핑된 디렉토리를 볼 수 있습니다.

composer.json

"autoload": {
    "psr-4": {
        "Book\\": "src/",
        "Vehicle\\": "src/"
    }
}   
  • 찾는 중\이력\미국(src/History/United States).php
  • 차량 검색 중\src/Air/Air/Wings/Airplane의 Air\Wings\Airplane.php

composer.json

"autoload": {
    "psr-4": {
        "Book\\": "src/Book/",
        "Vehicle\\": "src/Vehicle/"
    }
}    
  • 찾는 중\이력\미국 src/Book/History/United States.php
  • 차량 검색 중\src/Vehicle/Air/Wings/Airplane의 Air\Wings\Airplane.php

내가 노력해도 작곡가는 엉망이야.슬프게도, 시장의 유일한 대안입니다.
★★★★★★★★★★★★★★★★?
코드를 제어할 수 있는 경우 Composer의 자동 완성은 정상적으로 작동합니다.그러나 다른 프로젝트를 가져오는 경우 다양한 스타일과 폴더 작성 방법을 사용할 수 있습니다./company/src/class/클래스인 , 다른 클래스입니다.php, 다른 것은 회사/클래스입니다.php 회사/src/class/class.

이 문제를 해결하기 위한 라이브러리를 만들었습니다.

https://github.com/EFTEC/AutoLoadOne (무료, MIT)

폴더의 모든 클래스를 스캔하여 자동 포함을 생성하므로 모든 경우에 작동합니다(psr-0 psr-4, 네임스페이스가 없는 클래스, 여러 클래스가 있는 파일).

edit: 다시 이유 없이 다운투표를 했습니다.;-)

언급URL : https://stackoverflow.com/questions/24868586/what-are-the-differences-between-psr-0-and-psr-4

반응형