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\Bar
에src/Acme/Foo/Bar.php
PSR-4에서는 그것을 찾습니다.src/Bar.php
디렉토리 구조를 단축할 수 있습니다.한편, 일부에서는, 어느 네임스페이스에 무엇이 있는지를 명확하게 확인할 수 있는 완전한 디렉토리 구조를 선호합니다.따라서, 다음과 같이 말할 수도 있습니다.Acme\Foo\
인src/Acme/Foo
위의 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
(Bar class의 경우)가 동작합니다.Acme\Foo\Bar
--->src/Acme/Foo/Bar2.php
class의 가하지 않습니다.
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
'programing' 카테고리의 다른 글
"SET NAMS" 사용 여부 (0) | 2022.09.12 |
---|---|
pecl 확장을 설치하려고 하면 Mac os x 10.7.3에서 $PHP_AUTOCONF 오류가 발생함 (0) | 2022.09.12 |
Java 서브스트링()의 시간 복잡도 (0) | 2022.09.12 |
InnoDB가 테이블/테이블의 외부 키를 다시 확인하도록 강제하시겠습니까? (0) | 2022.09.12 |
php는 백그라운드 프로세스를 실행합니다. (0) | 2022.09.12 |