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


225

최근에 네임 스페이스와 그 이점에 대해 읽었습니다. 현재 Laravel에서 프로젝트를 만들고 클래스 맵 자동로드에서 네임 스페이스로 이동하려고합니다. 그러나 PSR-0과 PSR-4의 실제 차이점을 파악할 수 없습니다.

내가 읽은 일부 자료는 ...

내가 이해하는 것 :

  • PSR-4는 밑줄을 디렉토리 분리 자로 변환하지 않습니다
  • 특정 작곡가 규칙으로 인해 디렉토리 구조가 복잡해져 PSR-0 이름 공간을 자세하게 표시하여 PSR-4가 생성되었습니다.

차이점을 설명하는 예가 이해 될 것이다.


3
PSR0PSR4를 읽으십시오 . 모든 세부 사항을 설명합니다.
베리 M. 올슨


4
☝️ 누군가 이것의 요점을 답으로 입력해야합니다 ... :)
deceze

1
IMO, PSR의 대부분은 그들이
옳지

답변:


283

그것들은 매우 유사하므로 약간 혼란 스럽다는 것은 놀라운 일이 아닙니다. 요약하면 PSR-0은 PSR-4가 삭제 한 PEAR 스타일 클래스 이름에 대한 일부 하위 호환성 기능이 네임 스페이스 코드 만 지원한다는 점입니다. 그 외에도 PSR-4는 전체 네임 스페이스를 디렉토리 구조로 강제하지 않고 고정 점 다음 부분 만 갖도록합니다.

예를 들어 당신이 것을 정의하는 경우 Acme\Foo\네임 스페이스에 고정되어 src/PSR-0, 그것은을 찾아 의미 Acme\Foo\Bar에서 src/Acme/Foo/Bar.phpPSR-4가에서 찾는 반면 src/Bar.php짧은 디렉토리 구조를 허용. 반면에 일부는 또한 말할 수 있도록 명확하게하는 네임 스페이스에 뭐가 있는지에 전체 디렉토리 구조를 선호 Acme\Foo\src/Acme/FooPSR-4 것이다 당신에게 PSR-0 행동의 상당을 제공합니다 위의 설명과 함께합니다.

PSR-4를 사용하고 PSR-0에 관한 모든 것을 잊어 버릴 수 있습니다.


17
그것은 선택합니다 src/Bar.php당신이 말한다면Acme\Foo\ => src/
Seldaek

설명 감사합니다!
尤川豪

4
PSR-4가 PSR-0보다 느리지 않습니까?
Nguyen Linh

2
@NguyenLinh 나는 그렇게 생각하지 않습니다. 동일한 작업을 수행하지만 디렉토리 수준이 적을 수 있으므로 실제로 약간 빠를 수 있습니다. 그것을 측정하십시오. PSR-0과 PSR-4 사이를 전환 할 수있는 패키지를 만들 수 있습니다. 차이점은 없습니다.
Sven

44

주요 차이점은 다음과 같습니다.

1. 예를 들어 당신이 것을 정의하는 경우 Acme\Foo\네임 스페이스에 고정되고 src/,

  • PSR-0 그것은을 찾아 의미 Acme\Foo\Bar에서src/Acme/Foo/Bar.php
  • PSR-4에서 찾는다 반면 Acme\Foo\Bar에서 src/Bar.php(where Bar class is).

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

3. 네임 스페이스와 함께 PSR-4를 선호합니다

4. 위의 예를 고려할 때 클래스 이름이 파일 이름과 다른 경우에도 PSR-0이 작동하지 않습니다.

  • Acme\Foo\Bar ---> src/Acme/Foo/Bar.php (바 클래스) 작동합니다
  • Acme\Foo\Bar ---> src/Acme/Foo/Bar2.php(바 클래스) 작동하지 않습니다

1
네임 스페이스 스크립트없이 PSR-4를 사용할 수 있습니다. 그러한 제한이 없으며이를 사용합니다 (내 선택이 아님)
Galvani

당신의 1. (첫 번째 요점)에서 PSR-4 사건의 바는 어디에서 왔습니까?
cjmling

31

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의 세부 사항에는 약간의 차이가 있습니다. http://www.php-fig.org/psr/psr-4/


10

네임 스페이스 / 폴더 규칙.

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

일반적으로, root 폴더에 vendor /와 동일한 레벨에 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 / 도서 /History/UnitedStates.php
  • 찾고 자동차 에 \ 항공 \ 날개 \ 비행기 SRC / 차량 /Air/Wings/Airplane.php

psr-4

vendor/composer/autoload_psr4.php파일을 보면 네임 스페이스와 이들이 매핑 된 디렉토리를 볼 수 있습니다.

composer.json

"autoload": {
    "psr-4": {
        "Book\\": "src/",
        "Vehicle\\": "src/"
    }
}   
  • 찾고 에서 \ 역사 \ 미국 에선 SRC /History/UnitedStates.php
  • src 에서 차량 \ Air \ Wings \ Airplane을 찾고 /Air/Wings/Airplane.php

composer.json

"autoload": {
    "psr-4": {
        "Book\\": "src/Book/",
        "Vehicle\\": "src/Vehicle/"
    }
}    
  • 찾고 예약 \ 역사 \ 미국 에선의 SRC / 도서 /History/UnitedStates.php
  • 찾고 자동차 에 \ 항공 \ 날개 \ 비행기 SRC / 차량 /Air/Wings/Airplane.php

-4

시도했지만 Composer가 엉망입니다. 슬프게도, 그것은 시장의 유일한 대안입니다.
왜 엉망입니까?.
코드를 제어하는 ​​경우 합성기의 자동 완성 기능이 제대로 작동합니다. 그러나 다른 프로젝트를 가져 오는 경우 많은 스타일과 폴더를 만드는 방법이 있습니다. 예를 들어, 일부 프로젝트는 /company/src/class.php이고 다른 프로젝트는 company / class.php이고 다른 프로젝트는 company / src / class / class.php입니다.

나는 그것을 해결하는 라이브러리를 만들었습니다.

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

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

편집 : 그리고 다시, 이유없이 downvoted. ;-)


composer.json에서 클래스 맵 옵션에 대해 읽으십시오. getcomposer.org/doc/04-schema.md#classmap- 답을 내리는 이유 일 수 있습니다.
Patrick
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.