「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > 自動車局の戦い:PSR-0対PSR-4

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

2025-03-25に投稿されました
ブラウズ:295

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

キーテイクアウト

  • PSR-0およびPSR-4はPHPの自動搭載標準であり、PSR-0はクラスの名前空間に基づいてパスを定義し、クラス名のアンダースコアを許可します。
  • PSR-4は、パッケージ指向のオートローディングと呼ばれ、よりクリーンなパッケージを可能にしますが、実装がより複雑です。また、オートローダーが例外を投げたり、エラーを引き起こしたりして、複数のオートローダーとの互換性を維持しないようにします。
  • PSR-0とPSR-4の両方に長所と短所:PSR-4はより単純なフォルダー構造を可能にしますが、完全に資格のある名前からクラスの正確なパスを表示しませんが、PSR-0は混oticとしているが、古い命名規則とエイズを使用して開発者をサポートします。
  • PHPトレーニングの初心者の段階を通過した場合、PSR-0を聞いたことがあります。これは、必要や含めるようなステートメントを使用せずにコードにPHPクラスを自動的に含める方法を定義する自動搭載基準です。

psr-0

PSR-0は、クラスの名前空間を見て、その情報からハードドライブの位置を識別します。たとえば、クラス\ zend \ mail \メッセージは/path/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

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

ベンダー/ vendor_name/ package_name/ SRC/ vendor_name/ package_name/ classname.php#vendor_name \ package_name \ className テスト/ vendor_name/ package_name/ classnametest.php#vendor_name \ package_name \ classnametest

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を使用すると、上記のフォルダーツリーが次のようになります。

ベンダー/ vendor_name/ package_name/ SRC/ classname.php#vendor_name \ package_name \ className テスト/ classnametest.php#vendor_name \ package_name \ classnametest

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

PSR-0はクラス名
の一部の間の執り成しのパスを許可しないため

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

選ばれたアプローチ

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

これは、クラスをパッケージコードのどこにでも置くことができることを意味します。そこでは、人間としての意味があり、代替ロードテクニックを作成したり、手動負荷に頼らずにPHPでスムーズに使用します。

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

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

/path/to/packages/foo-bar/ SRC/ baz.php#foo \ bar \ baz qux/ quux.php#foo \ bar \ qux \ quux テスト/ baztest.php#foo \ bar \ baztest qux/ quuxtest.php#foo \ bar \ qux \ quuxtest

は次のようになります:

      /path/to/packages/foo-bar/
          src/
              Baz.php             # Foo\Bar\Baz
              Qux/
                  Quux.php        # Foo\Bar\Qux\Quux
          tests/
              BazTest.php         # Foo\Bar\BazTest
              Qux/
                  QuuxTest.php    # Foo\Bar\Qux\QuuxTest

new \ foo \ bar \ qux \ quuxを呼び出す場所new \ foo \ bar \ qux \ quuxtest。 2番目からロードしようとします。

 register();

    // register the base directories for the namespace    prefix
    $loader->addNamespace('Foo\Bar', '/path/to/packages/foo-bar/src');
    $loader->addNamespace('Foo\Bar', '/path/to/packages/foo-bar/tests');

結論

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

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

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

PSR-0およびPSR-4 Autoloading

に関するよくある質問

PSR-0とPSR-4の主な違いは何ですか? PSR-0には、名前空間とディレクトリ構造の間の直接的な相関が必要です。つまり、名前空間の各アンダースコアはディレクトリセパレーターに対応しています。一方、PSR-4は、名前空間の一部を任意のディレクトリにマッピングでき、名前空間の残りの部分をサブディレクトリ構造にマッピングできる、より柔軟なアプローチを可能にします。名前空間とディレクトリ構造の間のPSR-0の厳密な相関は、必ずしも実用的または効率的ではなかった深くネストされたディレクトリにつながりました。 PSR-4は、より柔軟なアプローチを提供し、開発者が名前空間を任意のディレクトリにマッピングできるようにし、ディープディレクトリネストの必要性を減らします。ただし、同じクラスをオートロードするために使用すべきではないことに注意することが重要です。両方の標準を使用すると、一部のレガシーコードがPSR-0標準に従う大規模プロジェクトでは有益ですが、新しいコードはPSR-4標準に従います。開発者は、名前空間の一部を任意のディレクトリにマッピングできるようになり、ディープディレクトリネストの必要性が減ります。これにより、プロジェクトのディレクトリ構造を管理してナビゲートしやすくなります。これは、まだ機能しているが、新しいプロジェクトでの使用をお勧めしないことを意味します。 PSR-4は、PHPでの自動装置の推奨標準です。その後、名前空間の残りの部分は、サブディレクトリ構造にマッピングされます。これにより、自動装置へのより柔軟で効率的なアプローチが可能になります。また、PHPでの自動装置の推奨基準であり、新しいプロジェクトに適した選択肢となります。

PSR-0からPSR-4? PSR-4では、名前空間の一部を任意のディレクトリにマッピングでき、名前空間の残りの部分をサブディレクトリ構造にマッピングできます。これには、プロジェクトのディレクトリ構造を再構築する必要がある場合があります。

古いPHPバージョンでPSR-4を使用できますか? PHPの古いバージョンを使用している場合、PSR-4を使用するためにアップグレードする必要があります。ただし、近い将来、PSR-4はPHPでの自動装置の推奨標準です。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3