自動車局の戦い:PSR-0対PSR-4

Christopher Nolan
Christopher Nolanオリジナル
2025-02-23 08:45:11200ブラウズ

Battle of the Autoloaders: PSR-0 vs. PSR-4

自動車局の戦い:PSR-0対PSR-4

キーテイクアウト

  • PSR-0とPSR-4はPHPの自動測定基準であり、PSR-0はクラスの名前空間に基づいてパスを定義し、クラス名のアンダースコアを許可します。 0.
  • パッケージ指向のオートローディングと呼ばれる
  • PSR-4は、よりクリーンなパッケージを可能にしますが、実装がより複雑です。また、オートローダーが例外を投げたり、エラーを引き起こしたりして、複数のオートローダーとの互換性を維持しないようにします。
  • PHPトレーニングの初心者の段階を通過した場合、PSR-0を聞いたことがあります。これは、必要や含めるなどのステートメントを使用せずにコードにPHPクラスを自動的に含める方法を定義する自動ローディング標準です。
psr-0

PSR-0は、クラスの名前空間を見て、その情報からハードドライブ上の位置を識別します。たとえば、クラスのZendMailMessageは/Path/to/Project/lib/vendor/zend/mail/message.php。

につながります

PSR-0は、5.2以前の移行を容易にするために、代替としてクラス名のアンダースコアもサポートしています。 zend_mail_messageは/path/to/project/lib/vendor/zend/mail/message.php。

にもつながります

作曲家

Composerが現れてPHPパッケージ管理の世界を席巻したとき、状況は変わりました。いくつかのルールのために、フォルダーはしばしば複製され、Composerを介してPSR-0クラスのインストールを見ると深くなりすぎました。たとえば、一部のフォルダー構造は次のようになりました:

これはせいぜい混oticとしています。なぜなら:

vendor/
    vendor_name/
        package_name/
            src/
                Vendor_Name/
                    Package_Name/
                        ClassName.php       # Vendor_Name\Package_Name\ClassName
            tests/
                Vendor_Name/
                    Package_Name/
                        ClassNameTest.php   # Vendor_Name\Package_Name\ClassNameTest

「SRC」および「テスト」ディレクトリには、ベンダーとパッケージのディレクトリ名を含める必要があります。これは、PSR-0コンプライアンスのアーティファクトです。

したがって、いくつかの高度に資格のあるPHP開発者が集まって、新しい標準の提案をまとめました:psr-4。

psr-4

PSR-4は、必要に応じてPSR-0を補完し、協力することを目指しています。完全に置き換えるわけではありません。それはできますが、そうする必要はありません。 PSR-4の主な目標は、PSR-0の残骸と5。3日前の残骸を完全に除去し、より簡潔なフォルダー構造を可能にすることです。 PSR-4を使用すると、上記のフォルダーツリーが次のようになります:

PSR-0のアップグレードはオプションではありませんでした

これは非常に重要です。これは、PSR-4の実装を実装しながら、よりクリーンなパッケージを許可しているが、実装がはるかに複雑になることを意味します。 PSR-4パッケージ指向のオートローディングを呼び出します。これは、シンプルさの前にパッケージの清潔さを支持するためです。

選択されたアプローチ

提案された目標は次のとおりです。すべてのパッケージに少なくとも2つの名前空間レベル(ベンダーとパッケージ)が含まれている必要があることをPSR-0ルールに保ち、ベンダーパッケージコンボが任意のフォルダーにマッピングできることを確認し、INFIXを許可しますベンダーパッケージのコンボと、完全に資格のあるクラス名の残りの間のフォルダー。

これは、クラスをパッケージコードのどこにでも配置できることを意味します。これは、人間としての意味があります。 さらに、ドラフトは、複数のオートローダーが登録される可能性があるという理由だけで、PSR-4オートローダーが例外をスローしたりエラーを引き起こすことはないことを明示的に述べています。エラーとフローを停止すると、この互換性が壊れます。障害に関する追加情報が必要な場合は、PSR-3互換のロガーまたはその他の任意の手段を使用する必要があります。

例ファイルに示されているように、PSR-4オートローダーを使用して次の構造からクラスをロードします。

は次のようになります:

新しいfoobarquxquuxを呼び出す場所;新しいfoobarquxquuxtestで、最初の登録ディレクトリからロードしようとします。 2番目からロードしようとします

この例は、単一の名前空間ごとの複数のフォルダーの使用も示しています。
vendor/
    vendor_name/
        package_name/
            src/
                Vendor_Name/
                    Package_Name/
                        ClassName.php       # Vendor_Name\Package_Name\ClassName
            tests/
                Vendor_Name/
                    Package_Name/
                        ClassNameTest.php   # Vendor_Name\Package_Name\ClassNameTest
結論

オートローディングには銀の弾丸はありません。それぞれのアプローチには、長所と短所があります。PSR-4は、より単純なフォルダー構造を可能にしますが、完全に資格のある名前を見るだけでクラスの正確なパスを知ることができません。一方、PSR-0はハードドライブで混oticとしていますが、過去に立ち往生している開発者をサポートしています(クラスの名前のアンダースコアユーザー)。その名を見るだけでクラスの場所を識別するのに役立ちます。
vendor/
    vendor_name/
        package_name/
            src/
                ClassName.php       # Vendor_Name\Package_Name\ClassName
            tests/
                ClassNameTest.php   # Vendor_Name\Package_Name\ClassNameTest

PSR-4についてどう思いますか?以下のコメントでお知らせください。または、多くの議論の1つであなたの意見を表明してください。

どちらの方法でも、どちらにしても、パッケージ指向のオートローディングがここに留まることは間違いありません。正式に標準として受け入れられない場合は、それを必要とする人々によって実装されたカスタム。議論に参加し、この正式な状態に到達するのに十分な概念を改善するのは私たち次第です。

PSR-0およびPSR-4オートローディング

に関するよくある質問

はい、同じプロジェクトでPSR-0とPSR-4の両方を使用することが可能です。ただし、同じクラスをオートロードするために使用すべきではないことに注意することが重要です。両方の標準を使用することは、一部のレガシーコードがPSR-0標準に従う大規模プロジェクトで有益であり、新しいコードはPSR-4標準に従います。

PSR-4は、オートローディングに対するより柔軟なアプローチを提供することにより、PSR-0を改善します。開発者は、名前空間の一部を任意のディレクトリにマッピングできるようになり、ディープディレクトリネストの必要性が減ります。これにより、プロジェクトのディレクトリ構造の管理とナビゲートが容易になります。古いPHPバージョンでPSR-4を使用できますか?

PSR-4にはPHP 5.3以降が必要です。 PHPの古いバージョンを使用している場合、PSR-4を使用するためにアップグレードする必要があります。 PHPは進化し続ける可能性が高く、言語とその生態系が進化するにつれて新しい基準と実践が導入されています。ただし、近い将来、PSR-4はPHPでの自動装置の推奨基準です。

以上が自動車局の戦い:PSR-0対PSR-4の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。