php自動ロード仕様psr 0 psr 4詳細
2770 ワード
1.psr 0これは何ですか.これは標準です.
クラスの自動ロードを実現する標準です.
その前に理解しておく必要があります.Autoloadとspl_autoload_registerという2つの方法.
なぜこの基準を実現するのか.
プロジェクト全体が自分で書いた他の人のコードが必要でない場合は、それはいいです.この基準をどのように定義したいのか.しかし、サードパーティのクラスライブラリを呼び出す必要がある場合.
2つの自動ロードクラスの基準が異なる可能性があるため、自動ロードクラスには1つの基準が必要です.
この基準を紹介します.
仕様:完全に限定するネーミングスペースおよびクラスは、以下の構造 を有する必要がある.各ネーミングスペースには、最上位ネーミングスペース(「仕入先名」)が必要です. 各ネーミングスペースは、可能な限り多くのサブネーミングスペースを有することができる. 仕入先名.ネーミングスペースとクラス名のアルファベット文字は、小文字と大文字の任意の組合せであってもよい.
具体的な実装:
これがこの標準を実現するコードです.
クラスをインスタンス化すると、そのクラスがロードされます.
autoload("/dir1/dir2/class1");
autoload("/dir1/dir2/class1_class2");
ロードされたクラスは(つまり実際の物理パス):
/dir1/dir2/class1.php
/dir1/dir2/class1/class2.php
まとめ:実はあなたがインスタンス化するクラスの名前に基づいて、1つの基準に従って、このクラスが具体的にどこにあるかを探して、それからrequireそれを探して、このように自動ロードを実現しました.
2.psr 4は何とpsr 0の違いがありますか?
psr 0の補充で、psrをもっと完備させます.
公式規範:完全に定義されたクラス名には、「ベンダーネーミングスペース」とも呼ばれるトップクラスのネーミングスペース名が必要です. 完全修飾クラス名は、1つ以上のサブネーミングスペース名を有することができる. 完全に限定されたクラス名には、終了クラス名が必要です. 下線は、クラス名を完全に限定するいかなる部分においても特に意味がない. 完全修飾クラス名のアルファベット文字は、小文字と大文字の任意の組合せであってもよい. すべてのクラス名は、大文字と小文字を区別して参照する必要があります.
例:
FULLY QUALIFIED CLASS NAME
NAMESPACE PREFIX
BASE DIRECTORY
RESULTING FILE PATH
\Acme\Log\Writer\File_Writer
Acme\Log\Writer
./acme-log-writer/lib/
./acme-log-writer/lib/File_Writer.php
\Aura\Web\Response\Status
Aura\Web
/path/to/aura-web/src/
/path/to/aura-web/src/Response/Status.php
\Symfony\Core\Request
Symfony\Core
./vendor/Symfony/Core/
./vendor/Symfony/Core/Request.php
\Zend\Acl
Zend
/usr/includes/Zend/
/usr/includes/Zend/Acl.php
あなたが見終わったら愚かかもしれませんが、私も少し愚かです.ソースコードを見て、理解してから補充しましょう.
クラスの自動ロードを実現する標準です.
その前に理解しておく必要があります.Autoloadとspl_autoload_registerという2つの方法.
なぜこの基準を実現するのか.
プロジェクト全体が自分で書いた他の人のコードが必要でない場合は、それはいいです.この基準をどのように定義したいのか.しかし、サードパーティのクラスライブラリを呼び出す必要がある場合.
2つの自動ロードクラスの基準が異なる可能性があるため、自動ロードクラスには1つの基準が必要です.
この基準を紹介します.
仕様:
\\(\)*
DIRECTORY_SEPARATOR
ファイルシステムからロードされると、各ネーミングスペースセパレータは1つに変換されます._
CLASS NAMEの各文字は、a DIRECTORY_SEPARATOR
に変換される._
文字は、名前空間に特別な意味を持たない..php
ファイルシステムからロードされると、名前空間およびクラス接尾辞が完全に限定される.具体的な実装:
これがこの標準を実現するコードです.
クラスをインスタンス化すると、そのクラスがロードされます.
autoload("/dir1/dir2/class1");
autoload("/dir1/dir2/class1_class2");
ロードされたクラスは(つまり実際の物理パス):
/dir1/dir2/class1.php
/dir1/dir2/class1/class2.php
まとめ:実はあなたがインスタンス化するクラスの名前に基づいて、1つの基準に従って、このクラスが具体的にどこにあるかを探して、それからrequireそれを探して、このように自動ロードを実現しました.
2.psr 4は何とpsr 0の違いがありますか?
psr 0の補充で、psrをもっと完備させます.
公式規範:
例:
FULLY QUALIFIED CLASS NAME
NAMESPACE PREFIX
BASE DIRECTORY
RESULTING FILE PATH
\Acme\Log\Writer\File_Writer
Acme\Log\Writer
./acme-log-writer/lib/
./acme-log-writer/lib/File_Writer.php
\Aura\Web\Response\Status
Aura\Web
/path/to/aura-web/src/
/path/to/aura-web/src/Response/Status.php
\Symfony\Core\Request
Symfony\Core
./vendor/Symfony/Core/
./vendor/Symfony/Core/Request.php
\Zend\Acl
Zend
/usr/includes/Zend/
/usr/includes/Zend/Acl.php
あなたが見終わったら愚かかもしれませんが、私も少し愚かです.ソースコードを見て、理解してから補充しましょう.