최근에 네임 스페이스와 그 이점에 대해 읽었습니다. 현재 Laravel에서 프로젝트를 만들고 클래스 맵 자동로드에서 네임 스페이스로 이동하려고합니다. 그러나 PSR-0과 PSR-4의 실제 차이점을 파악할 수 없습니다.
내가 읽은 일부 자료는 …
내가 이해하는 것 :
- PSR-4는 밑줄을 디렉토리 분리 자로 변환하지 않습니다
- 특정 작곡가 규칙으로 인해 디렉토리 구조가 복잡해져 PSR-0 이름 공간을 자세하게 표시하여 PSR-4가 생성되었습니다.
차이점을 설명하는 예가 이해 될 것이다.
답변
그것들은 매우 유사하므로 약간 혼란 스럽다는 것은 놀라운 일이 아닙니다. 요약하면 PSR-0은 PSR-4가 삭제 한 PEAR 스타일 클래스 이름에 대한 일부 하위 호환성 기능이 네임 스페이스 코드 만 지원한다는 점입니다. 그 외에도 PSR-4는 전체 네임 스페이스를 디렉토리 구조로 강제하지 않고 고정 점 다음 부분 만 갖도록합니다.
예를 들어 당신이 것을 정의하는 경우 Acme\Foo\
네임 스페이스에 고정되어 src/
PSR-0, 그것은을 찾아 의미 Acme\Foo\Bar
에서 src/Acme/Foo/Bar.php
PSR-4가에서 찾는 반면 src/Bar.php
짧은 디렉토리 구조를 허용. 반면에 일부는 또한 말할 수 있도록 명확하게하는 네임 스페이스에 뭐가 있는지에 전체 디렉토리 구조를 선호 Acme\Foo\
에 src/Acme/Foo
PSR-4 것이다 당신에게 PSR-0 행동의 상당을 제공합니다 위의 설명과 함께합니다.
PSR-4를 사용하고 PSR-0에 관한 모든 것을 잊어 버릴 수 있습니다.
답변
주요 차이점은 다음과 같습니다.
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
(바 클래스) 작동하지 않습니다
답변
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/
답변
네임 스페이스 / 폴더 규칙.
클래스는 네임 스페이스에 따라 폴더에 저장해야합니다.
일반적으로, 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
답변
시도했지만 Composer가 엉망입니다. 슬프게도, 그것은 시장의 유일한 대안입니다.
왜 엉망입니까?.
코드를 제어하는 경우 합성기의 자동 완성 기능이 제대로 작동합니다. 그러나 다른 프로젝트를 가져 오는 경우 많은 스타일과 폴더를 만드는 방법이 있습니다. 예를 들어, 일부 프로젝트는 /company/src/class.php이고 다른 프로젝트는 company / class.php이고 다른 프로젝트는 company / src / class / class.php입니다.
나는 그것을 해결하는 라이브러리를 만들었습니다.
https://github.com/EFTEC/AutoLoadOne (무료, MIT).
폴더의 모든 클래스를 스캔하여 자동 포함을 생성하므로 모든 경우 (psr-0 psr-4, 네임 스페이스가없는 클래스, 여러 클래스가있는 파일)에서 작동합니다.
편집 : 그리고 다시, 이유없이 downvoted. 😉