PHP標準推奨(PSR)の概要
公開: 2019-12-24昔々、会議で、選択されたフレームワークの主任開発者が同じ部屋に座り、すべてのプロジェクトで使用するためのいくつかの基準に同意しました。 目的は、PHPフレームワークとライブラリをユーザーが簡単に組み合わせることができるようにすることでした。 その時、php-fig:PHP Framework InteropGroupが誕生しました。 この素晴らしい個人のグループは、PHP Standards Recommendations(PSR)を監督しています。
PHP Standard Recommendation(PSR)は、PHP Framework Interoperability Group(PHP-FIG)によって公開されたPHP仕様です。 これは、PHPでのプログラミング概念の標準化に役立ちます。 目的は、コンポーネントの相互運用性を可能にすることです。 PHP-FIGは、いくつかのPHPフレームワークの創設者によって形成されています。
PSR-0&PSR-4
これらは、ファイルパスからクラスを自動ロードするための仕様を説明しています。 PSR-0とPSR-4はどちらも、名前空間、クラス名、ファイルパスに関する標準です。 このPSRは、仕様に従って自動ロードされるファイルを配置する場所についても説明します。
自動読み込み
自動読み込みは、散らかったinclude / requireステートメントをどこにでも記述せずに、PHPクラスを含む開発者を自動的に支援する機能です。
PHPでは、クラスの定義は、以下に示すように使用する前に、呼び出されるファイルにrequireまたはincludeステートメントとともにロードされます。

上記のアプローチでは、ファイルで使用する外部クラスが数十あるかのようにいくつかの問題が発生し、ソースファイルの先頭からrequire / includeステートメントの行を書き始めます。
この問題を克服するために、PHP 5では、コードがまだロードされていないクラスまたはインターフェイスを参照するときに自動的に呼び出される魔法の関数__autoload()が導入されました。

基本的な__autoload()実装の例を次に示します。

__autoload()関数の主な欠点は、オートローダーを1つしか提供できないことです。 PHP 5.1.2では、__ autoloadの制限に対処するための別の自動ロード関数(spl_autoload_register)が導入されました。
spl_autoload_register()の導入により、プログラマーは自動ロードチェーンを作成できるようになりました。これは、クラスまたはインターフェイスをロードするために呼び出すことができる一連の関数です。
例えば:


自動読み込みは非常に優れたアイデアであったため、すべてのプロジェクトで自動読み込みが使用され始めました。 統一された標準が欠けていたため、必然的に誰もが独自のバージョンのオートローダーを作成しました。 明らかに、PHPはオートローダーの標準を切実に必要としていました。それがPSR-0の誕生です。 最新のオートローダー規格はPSR-4です。
PSR-0(自動読み込み標準)
PSR-0の概要:
- 完全修飾の名前空間とクラスは、次の構造である必要があります
\ <ベンダー名> \(<名前空間> \)* <クラス名> - 各名前空間には、最上位の名前空間(「ベンダー名」)が必要です。
- 各名前空間には、必要な数のサブ名前空間を含めることができます。
- 各名前空間区切り文字は、ファイルシステムからロードするときにDIRECTORY_SEPARATORに変換されます。
- CLASS NAMEの各_文字は、DIRECTORY_SEPARATORに変換されます。 _文字は名前空間で特別な意味を持ちません。
- 完全修飾された名前空間とクラスには、ファイルシステムからロードするときに.phpという接尾辞が付きます。
- ベンダー名、名前空間、およびクラス名のアルファベット文字は、小文字と大文字の任意の組み合わせにすることができます。
例:
\ Doctrine \ Common \ IsolatedClassLoader =>
/path/to/project/lib/vendor/Doctrine/Common/IsolatedClassLoader.php
\ Symfony \ Core \ Request =>
/path/to/project/lib/vendor/Symfony/Core/Request.php
PSR-4(自動読み込み標準)
PSR-4の概要:
- 「クラス」という用語は、クラス、インターフェース、特性、およびその他の同様の構造を指します。
- 完全修飾クラス名の形式は次のとおりです。
\ <NamespaceName>(\ <SubNamespaceNames>)* \ <ClassName> - 完全修飾クラス名には、「ベンダー名前空間」とも呼ばれる最上位の名前空間名が必要です。
- 完全修飾クラス名には、1つ以上のサブ名前空間名が含まれる場合があります。
- 完全修飾クラス名には、終了クラス名が必要です。
- 完全修飾クラス名のどの部分でも、アンダースコアには特別な意味はありません。
- 完全修飾クラス名の英字は、小文字と大文字の任意の組み合わせにすることができます。
- すべてのクラス名は、大文字と小文字を区別して参照する必要があります。
Composerを使用したPSR-4ベースの自動ロードの例:
- Composerを使用してPSR-4ベースの自動ロードを実現するには、次のディレクトリ構造を検討してください。

- composerinitを使用してcomposer.jsonファイルを作成します。 そうでない場合は、プロジェクトのルートに手動で作成できます。

- 以下に示すようにcomposer.jsonファイルを編集して、PSR4の自動読み込みを設定します。

- ここで、CodeCourseはアプリケーションのベンダー名です。この名前は、次のようなsrcディレクトリ内のファイルの名前空間で使用できます。

または

等、

- また、srcは、自動ロードするアプリケーションのディレクトリです。
- 次に、ターミナルを開き、次のコマンドを入力して、プロジェクトに自動読み込みファイルをインストールします。これにより、ベンダーディレクトリとautoload.phpファイルがその中に生成されます。

- まず、CodeCourseディレクトリ内にいくつかのクラスを作成しましょう。
CodeCourse / Filters内にAuthFilters.phpを作成します

CodeCourse / Repositories内にUserRepository.phpを作成します

- 最後に、index.phpファイルを作成してテストし、autoload.phpファイルをindex.phpファイルに1回要求する必要があります。

PSR-1&PSR-2
PSR-1およびPSR-2は、PHPコーディング標準に役立ちます。 PSR-1は主にPHPの基本的なコーディング標準に焦点を当てていますが、PSR-2はPSR-1の拡張バージョンに似ています。 PSR-1は、命名規則の一連の簡単なルールをリストし、PSR-2は、より包括的なコーディングスタイルガイドを提供します。
PSR-1(基本コーディング標準)
PSR-1の概要:
- PHPタグに使用できるのは<?phpまたは<?=のみです。
- クラス名はUpperCamelCaseで定義する必要があります。
- クラス変数はキャメルケースで定義する必要があります。
- クラス定数はUPPER_SNAKE_CASEで定義する必要があります。
- メソッド名はキャメルケースで定義する必要があります。
- ファイルは、シンボル(クラス、関数、定数など)を宣言するか、副作用(出力の生成、.ini設定の変更など)を引き起こす必要がありますが、両方を行うべきではありません。 つまり、

上記の例では、「file.php」という名前のファイルをロードするという副作用が発生します。
- ファイルは、BOM(バイト順マーク)のないUTF-8である必要があります。
- 名前空間とクラス名は、PSR-0とPSR-4の標準に従う必要があります。
これは、プロパティ、クラス、およびメソッドの基本的な命名規則を示す例です。

PSR-2(コーディングスタイルガイド)
PSR-2の概要:
- PSR-1コーディング標準に従う必要があります。
- インデントには4つのスペースを使用する必要があります。 タブの使用は許可されていません。
- 行の長さに制限はありませんが、120文字未満にする必要があり、80文字未満の場合に最適です。
- 名前空間宣言の後に1行の空白行が必要であり、使用ブロック宣言の後に1行の空白行が必要です。
- クラスとメソッドの中括弧を開くには次の行に移動し、中括弧を閉じるには本体の後の行に移動する必要があります。
- メソッドとプロパティは、最初にabstract / finalで定義し、次にpublic / protectedで定義し、最後にstaticキーワードで定義する必要があります。
- 条件文で中括弧の前に改行を入れてはいけません。
- 条件文の(および)の前にスペースを入れてはなりません。
- クラスを定義する例:
- 新しい行で中括弧を開く必要があり、extendsおよびimplementsキーワードを1行で使用する必要があります。

実装するインターフェースが複数ある場合は、以下に示すように、新しい行にインターフェース名を書き込むことができます。

PHPでメソッドがどのように定義されているかを示す例:
メソッドを定義するときは、引数を同じ行に記述する必要があります。 また、引数のコンマの前に空白を入れてはならず、その後ろに1つの空白を入れてください。

引数の数が多い場合は、次々に改行で書くことができます。

メソッドを定義するときは、public / protected / privateとabstract / finalのいずれかが必要です。 可視性モードは、使用されている場合、abstract / finalキーワードの後にあります。 staticは最後の修飾子です。

条件文
- (の前に1つの空白を置く必要があります
- (の後に空白を入れてはいけません
- の前に空白を入れないでください)
- の後に空白を1つ入れる必要があります)
- elseifではなくelseifを使用します。
elseifとelseifの違いを示す例:
elseifの解釈:

次の場合のelseの解釈:

switchステートメントの場合、
- 中括弧は、switchステートメントが記述されているのと同じ行で開く必要があります。
- ケース本体はケースから1回インデントする必要があり、ケースはスイッチから1回インデントする必要があります。
- 休憩が不要な場合は休憩なしを使用してください。
- breakの代わりにreturnを使用することもできます。
例:
