目次
PSRとは
PSRとはPHP Standards Recommendations(PHP標準規約)の略で、PHPのコーディング規約をまとめたものです。
過去にはZend FrameworkやCakePHP等のフレームワーク、PEAR等のライブラリ毎に独自のコーディング規約を設けて開発を行っていました。現在では開発を行うときにComposer等のパッケージ管理ツールを使って、必要なフレームワーク、ライブラリを利用して開発するというスタイルが普及しています。その時に、各ライブラリ間で相互利用ができるようにコーディング規約を統一しましょうということでPSRが作成されました。
作成しているのはPHP-FIG(PHP Framework Interop Group)というグループで、CakePHP、Composer、Drupal、Laravel、PEAR、Symfony、Zend Framework 2などの主要なPHPフレームワーク、ツールの開発者が集まっています。
現在の規約
PSRには番号が振られていて、番号毎に何に関しての規約なのかが決まっています。現在公開されている規約には以下のものがあります。
- PSR-1 基本的な標準コーディング規約(Basic Coding Standard)
- PSR-2 コーディングスタイルガイド(Coding Style Guide)
- PSR-3 ログインターフェース(Logger Interface)
- PSR-4 標準オートローディング(Autoloading Standard)
- PSR-6 キャッシュインターフェース(Caching Interface)
- PSR-7 HTTPメッセージインターフェース(HTTP Message Interfaces)
使用頻度が高そうな規約はPSR-1、PSR-2、PSR-4あたりでしょうか。PHPで開発される方は一度は目を通しておいた方がいいと思います。
まだ作成中の規約もあり、PSR-5(PHPドキュメントについて)やPSR-9、PSR-10(セキュリティについて)などは現在作成中です。
また、既に廃止された規約もあり、PSR-0(オートローディングについて)は廃止され、PSR-4に置き換えられました。
今回はPSR-7(HTTPメッセージインターフェース)にどのようなことが書かれているかを見ていきます。
PSR-7 HTTPメッセージインターフェース
PSR-7ではHTTPメッセージやURIを扱うときのインターフェースについて書かれています。
PHPでHTTPメッセージを扱う場面というのは、POSTやGET、COOKIEなどのデータを取得したり、cURLを使用して外部のURIにアクセスしたりする場合等があります。
特に規約などが無くても、$_POSTや$_GETなどのグローバル変数を直接使用したり、フレームワークに備え付けのライブラリを利用すれば問題なく開発できますが、この規約に従って作成することによって他のライブラリを使用したり、もしくは自分の作ったライブラリを他の開発者に使用してもらうことがやりやすくなります。
インターフェース
PSR-7ではの以下のインターフェースを提供しています。
全てのインターフェースの名前空間はPsr\Http\Messageになります。
MessageInterface.php | HTTPメッセージの元になるインターフェース。リクエスト、レスポンス共通のメソッドをもつ。 |
---|---|
RequestInterface.php | リクエスト用インターフェース。MessageInterfaceを継承 |
ResponseInterface.php | レスポンス用インターフェース。MessageInterfaceを継承 |
ServerRequestInterface.php | サーバーリクエスト用のインターフェース。RequestInterfaceを継承 |
StreamInterface.php | PHPのストリームを扱うインターフェース。 |
UploadedFileInterface.php | HTTPリクエストでアップロードされたファイルを扱うインターフェース。値オブジェクト |
UriInterface.php | URIを扱うインターフェース。値オブジェクト |
MessageInterface
HTTPメッセージの元になるインターフェースです。リクエスト、レスポンスに共通するメソッドを持ちます。
HTTPプロトコルのバージョンを取得する getProtocolVersion()、ヘッダーを取得する getHeaders()、HTTPメッセージのボディを取得する getBody() 等のメソッドが用意されています。
RequestInterface
HTTPリクエストを投げるときに使用するインターフェースです。
MessageInterfaceを継承しています。リクエスト先を設定する withRequestTarget()、HTTPメソッドを設定する withMethod() 等のメソッドがあります。
ResponseInterface
HTTPレスポンスを返す時に使用するインターフェースです。
MessageInterfaceを継承しています。HTTPステータスコードを設定する withStatus() メソッドなどがあります。
ServerRequestInterface
サーバーサイドで使用する、送られてきたHTTPリクエストを扱うためのインターフェースです。
RequstInterfaceを継承しています。サーバー変数を取得する getServerParams()、クッキーを取得する getCookieParams()、GETデータを取得する getQueryParams()、POSTデータを取得する getParsedBody() などがあります。
StreamInterface
ストリームデータを扱うためのインターフェース。
全てのデータを文字列にして返す __toString() や、サイズを取得する getSize()、ストリームに書き込む write() 等のメソッドがあります。
UploadedFileInterface
HTTPリクエストでアップロードされたファイルを扱うためのインターフェースです。
このインターフェースを使用するオブジェクトは値オブジェクトで、状態を変更できないようにすべきです。getStream() メソッドでアップロードされたファイルにアクセスします。このメソッドは StreamInterfaceオブジェクトを返します。アップロードファイルを保存する moveTo() や、送られてきたメディアの種類を取得する getClientMediaType() などがあります。
UriInterface
URIを扱うためのインターフェースです。値オブジェクトで変更不可になります。
スキームを取得する getScheme()、ホストを取得する getHost()、パスを取得する getPath() 等のメソッドがあります。
最後に
PSR-7ではHTTPメッセージのインターフェースを提供しています。インターフェースだけなので実装は自分で行う必要があります。既存のシステムやフレームワークには既に便利なライブラリやクラスが存在しているので、わざわざこの規約に対応させる必要はありません。フレームワークやライブラリを利用する側にとっては、使用するライブラリがPSR-7に対応しない限りあまり意識するものでもないような気がします。
ただ、今後、新しくシステムを作る場合にこの規約に沿った作りをすることによって、外部ライブラリやフレームワーク等を利用する場合に統一感や利便性が高まるのではないでしょうか。