最近、名前空間とその利点について読んでいます。現在、Laravelでプロジェクトを作成しており、クラスマップのオートロードからネームスペースに移行しようとしています。ただし、PSR-0とPSR-4の実際の違いを把握することはできません。
私が読んだいくつかのリソースは...
私が理解したこと:
違いを説明する例は高く評価されるでしょう。
それらは非常に似ているので、少し混乱するのは驚くことではありません。要約すると、PSR-0はPSRスタイルのクラス名に対して下位互換性機能を備えていたため、PSR-4は名前空間コードのみをサポートしているため、PSR-4が削除しました。その上、PSR-4は、名前空間全体をディレクトリ構造として強制するのではなく、アンカーポイントに続く部分のみを強制します。
たとえば、Acme\Foo\
名前空間をsrc/
に固定すると定義した場合、PSR-0ではAcme\Foo\Bar
でsrc/Acme/Foo/Bar.php
を検索し、PSR-4ではsrc/Bar.php
で検索し、より短いディレクトリ構造を許可します。一方、一部の人は、どのネームスペースにあるかを明確に確認するために完全なディレクトリ構造を持つことを好むため、Acme\Foo\
はPSR-4を使用してsrc/Acme/Foo
にあり、上記のPSR-0の動作に相当することもできます。
新しいプロジェクト、およびほとんどの意図と目的のための短い話では、PSR-4を使用して、PSR-0のすべてを忘れることができます。
主な違いは次のとおりです。
1。たとえば、Acme\Foo\
名前空間がsrc/
に固定されていると定義した場合、
Acme\Foo\Bar
でsrc/Acme/Foo/Bar.php
を探すことを意味します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クラス用)は機能しません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/
名前空間/フォルダーの規則。
クラスは、名前空間に従ってフォルダに保存する必要があります。
一般に、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/"
}
}
psr-4
vendor/composer/autoload_psr4.php
ファイルを見ると、名前空間とそれらがマップされているディレクトリを確認できます。
composer.json
"autoload": {
"psr-4": {
"Book\\": "src/",
"Vehicle\\": "src/"
}
}
composer.json
"autoload": {
"psr-4": {
"Book\\": "src/Book/",
"Vehicle\\": "src/Vehicle/"
}
}