PSR-0とPSR-4の違いは何ですか?


225

最近、名前空間と、それがどのように有益であるかについて読みました。私は現在Laravelでプロジェクトを作成しており、クラスマップのオートロードからネームスペースに移行しようとしています。ただし、PSR-0とPSR-4の実際の違いは理解できません。

私が読んだいくつかのリソースは...

私が理解していること:

  • PSR-4はアンダースコアをディレクトリセパレータに変換しません
  • composerの特定の特定のルールにより、ディレクトリ構造が複雑になり、PSR-0ネームスペースが冗長になり、PSR-4が作成されます

違いを説明する例をいただければ幸いです。


3
読むPSR0PSR4。彼らはすべての詳細を説明します。
スベリM.オルセン2014


4
☝️誰かがこの要点を回答として入力する必要があります... :)
deceze

1
IMO、PSRのほとんどの部分は、正しいものではなく
好き

回答:


283

それらは非常に似ているので、少し混乱するのは当然のことです。要約すると、PSR-0はPSR-4が削除したPEARスタイルのクラス名の下位互換性機能をいくつか備えていたため、名前空間コードのみをサポートしています。その上、PSR-4は、ネームスペース全体をディレクトリ構造として強制するのではなく、アンカーポイントに続く部分のみを強制します。

たとえば、Acme\Foo\ネームスペースがでアンカーされていると定義した場合src/、PSR-0ではそれが検索さAcme\Foo\Barsrc/Acme/Foo/Bar.php、PSR-4ではネームスペースがで検索されるため、src/Bar.phpディレクトリ構造が短くなります。一方、完全なディレクトリ構造を使用して、どの名前空間に何があるかを明確に確認することを好む人もいます。そのため、これは、上記のPSR-0の動作と同等の機能を提供するPSR-4に含まAcme\Foo\src/Acme/Fooているとも言えます。

新しいプロジェクトとほとんどの目的と目的のための短い話ですが、PSR-4を使用してPSR-0のすべてを忘れることができます。


17
src/Bar.phpあなたが言うなら選ぶAcme\Foo\ => src/
Seldaek

説明ありがとうございます!
尤川豪

4
PSR-4はPSR-0より遅いですよね?
Nguyen Linh 2015

2
@NguyenLinh私はそうは思いません。同じことを行いますが、ディレクトリのレベルが少ない可能性があるため、実際には少し高速かもしれません。それを測定します。PSR-0とPSR-4を切り替えることができるパッケージを作成できます。違いはわかりません。
2015年

44

主な違いは次のとおりです。

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クラス用)は機能します
  • Acme\Foo\Bar ---> src/Acme/Foo/Bar2.php(Barクラスの場合)は機能しません

1
名前空間スクリプトなしでPSR-4を使用できます。そのような制限はなく、私はそれを使用します(私の選択ではありません)
Galvani

あなたの1.(最初のポイント)で、PSR-4の場合、Barはどこから来たのですか?
cjmling 2017年

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

名前空間/フォルダの規則。

クラスは、その名前空間に従ってフォルダに格納する必要があります。

一般に、ルートフォルダーに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 / Book /History/UnitedStates.php でBook \ History \ UnitedStatesを探しています
  • src / Vehicle /Air/Wings/Airplane.php でVehicle \ Air \ Wings \ Airplaneを探しています

psr-4

見るとvendor/composer/autoload_psr4.php、ファイル、あなたは彼らがマップされている名前空間とディレクトリを見ることができます。

composer.json

"autoload": {
    "psr-4": {
        "Book\\": "src/",
        "Vehicle\\": "src/"
    }
}   
  • src /History/UnitedStates.php でBook \ History \ UnitedStatesを探しています
  • src /Air/Wings/Airplane.php でVehicle \ Air \ Wings \ Airplaneを探しています

composer.json

"autoload": {
    "psr-4": {
        "Book\\": "src/Book/",
        "Vehicle\\": "src/Vehicle/"
    }
}    
  • 探しているブック \史\ UnitedStatesののSRC /予約 /History/UnitedStates.php
  • src / Vehicle /Air/Wings/Airplane.php でVehicle \ Air \ Wings \ Airplaneを探しています

-4

試してみてもComposerはめちゃくちゃです。悲しいことに、それは市場の唯一の選択肢です。
なぜ混乱するのですか?
コードを制御できれば、Composerのオートコンプリートは問題なく機能します。ただし、別のプロジェクトをインポートしている場合は、多くのスタイルとフォルダを作成する方法があります。たとえば、一部のプロジェクトは/company/src/class.phpですが、他のプロジェクトはcompany / class.phpで、その他のプロジェクトはcompany / src / class / class.phpです。

私はそれを解決するライブラリを作成しました:

https://github.com/EFTEC/AutoLoadOne(無料、MIT)。

フォルダーのすべてのクラスをスキャンして自動組み込みを生成するため、どの場合でも機能します(psr-0 psr-4、名前空間のないクラス、複数のクラスのあるファイル)。

編集:そして再び、何の理由もなく反対投票されました。;-)


composer.jsonのクラスマップオプションについて読んでください。getcomposer.org/doc/04-schema.md#classmap-回答を拒否する理由かもしれません。
Patrick
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.