web-dev-qa-db-ja.com

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

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

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

私が理解したこと:

  • PSR-4はアンダースコアをディレクトリ区切り文字に変換しません
  • composerの特定の規則により、ディレクトリ構造が複雑になり、PSR-0のネームスペースが冗長になり、PSR-4が作成されました。

違いを説明する例は高く評価されるでしょう。

200
Varun Nath

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

たとえば、Acme\Foo\名前空間をsrc/に固定すると定義した場合、PSR-0ではAcme\Foo\Barsrc/Acme/Foo/Bar.phpを検索し、PSR-4ではsrc/Bar.phpで検索し、より短いディレクトリ構造を許可します。一方、一部の人は、どのネームスペースにあるかを明確に確認するために完全なディレクトリ構造を持つことを好むため、Acme\Foo\はPSR-4を使用してsrc/Acme/Fooにあり、上記のPSR-0の動作に相当することもできます。

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

256
Seldaek

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

1。たとえば、Acme\Foo\名前空間がsrc/に固定されていると定義した場合、

  • pSR-0では、Acme\Foo\Barsrc/Acme/Foo/Bar.phpを探すことを意味します
  • pSR-4では、src/Bar.php(where Bar class is)Acme\Foo\Barを探します。

2。 PSR-4はアンダースコアをディレクトリ区切り文字に変換しません

名前空間でPSR-4を使用することをお勧めします

4。上記の例を考慮すると、クラス名がファイル名と異なっていても、PSR-0は機能しません。

  • Acme\Foo\Bar ---> src/Acme/Foo/Bar.php(Barクラス用)は動作します
  • Acme\Foo\Bar ---> src/Acme/Foo/Bar2.php(Barクラス用)は機能しません
40
Adil Abbasi

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/

25
wbswjc

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

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

一般に、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-

非推奨です。 vendor/composer/autoload_namespaces.phpファイルを見ると、名前空間とそれらがマップされているディレクトリを確認できます。

composer.json

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

psr-4

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

composer.json

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

composer.json

"autoload": {
    "psr-4": {
        "Book\\": "src/Book/",
        "Vehicle\\": "src/Vehicle/"
    }
}    
  • 探しているBook\History\UnitedStates src/Book/History/UnitedStates.php
  • 車両\Air\Wings\Airplane in src/Vehicle/Air/Wings/Airplane.phpを探しています
6
Udhav Sarvaiya