PSR対応 ~プログラム研究室~


 お久しぶりです!
 ナビゲータのEVEです。
セキュリティ.jpg
 中小企業診断士の資料を整理するのに時間を取られ、ブログの更新まで手が回りませんでした。しかも、システム開発では、昨日終了予定だったPSR対応にも影響が及び、つい先ほど完了し、これから、クラス開発に入れる状態です。ただ、ブログアップロード後は、同じく遅れている、独習PHPの情報整理の方が先になると思います。
 そんなシステム開発ですが、本日時間が取られたPSR対応についてお話ししたいと思います。

[PSR-4]
 PSRについて以前御紹介しましたが、PSR-1からPSR-11まで分かれており、その中にPSR-4があるのですが、その対応に時間が取られました。PSRを要約すると以下の通りとなります。以下は、ChatGPTの解説です。

 PSR-4は、PHPのオートローディング標準を定義するもので、クラスや名前空間の自動読み込みを容易にするための規則を提供します。これにより、クラスファイルの管理がシンプルになり、特に大規模なアプリケーションやライブラリの開発において、依存性管理やコードの可読性が向上します。
■PSR-4の主な要点
❶名前空間とディレクトリ構造
 クラスは名前空間を使用して構造化され、各名前空間はディレクトリにマッピングされます。例えば、Acme\Book というクラスは、Acme/Book.php というパスに配置されます。
❷ベースディレクトリ
 PSR-4では、オートローダーはベースディレクトリを指定する必要があります。このベースディレクトリは、名前空間のプレフィックスに関連付けられ、オートローダーはこのベースディレクトリを基準にしてクラスを探します。
❸プレフィックス
 名前空間のプレフィックスは、特定のディレクトリにマッピングされる必要があります。たとえば、Acme\ という名前空間が src/ ディレクトリにマッピングされている場合、クラス Acme\Book は src/Book.php に位置します。
❹ファイル名
 クラス名とファイル名は大文字と小文字を区別し、正確に一致させる必要があります。たとえば、Acme\Book というクラスは Book.php というファイルに保存されます。
❺複数のベースディレクトリ
 一つのオートローダーで複数の名前空間プレフィックスを使用し、それぞれ異なるベースディレクトリを設定することも可能です。これにより、さまざまなライブラリやパッケージを容易に統合できます。

名前空間とは、使用することでクラスの名前の衝突を防ぎ、コードの組織化を図ることができます。Apacheのディレクトリ構造には依存せず、いろいろなプロジェクトがクラスを容易に管理できる仕組みです。では、このPSR-4の主題となるオートローダーについて解説をしましょう!

[オートローダーを使用したプログラム]
 説明する前にどんなモノなのか、ソースを見てみましょう!

<?php/*** Function Name    : ❶オートローダー* Author           : EVE* Creation Date    : 2024年11月1日* Last Updated Date:* Release Date     :* System Version   :* Overview         : オートローダーの機能を提供する*/// オートローダー関数function myAutoloader($class) {// クラス名に基づいてファイルパスを決定$file = $class . '.php';//ファイルが存在するかどうか判定するif (file_exists($file)) {// ファイルを読み込むrequire_once $file;} else {// ファイルが読み込めない場合throw new Exception('File not found: ' . $file);}}// ❶オートローダーを登録spl_autoload_register('myAutoloader');?><?php// オートローダーをインポート❶require_once 'myAutoloader.php';/*** Function Name    : 配列クラス* Author           : EVE* Creation Date    : 2023年12月16日* Last Updated Date:* Release Date     :* System Version   :* Overview         : 配列の基本的な操作を行う*/class ArrayClass ❷extends ErrorMessageClass{public function __construct(array $arrayObject)                 // 編集対象配列{・・・・・・・}/*** Function Name    : 配列→文字列変換メソッド* Parameters       : sepa 種別* Return Value*┣ On Success     : 編集後文字列*┗ On Failure     : false* Author           : EVE* Creation Date    : 2024年1月11日* Last Updated Date:* Release Date     :* Program Version   :* Overview         : 配列から文字列に変換する*/public function meuImplode( stirng $sepa ):false|string{・・・・・}・・・・/*** Function Name    : デストラクタ* Parameters       : なし* Return Value*┣ On Success     : なし*┗ On Failure     : なし* Author           : EVE* Creation Date    : 2023年12月16日* Last Updated Date:* Release Date     :* Program Version   :* Overview         : オブジェクトが消滅する場合の処理を定義する*/public function __destruct():void{//エラーメッセージクラスのデストラクタを実行する❸parent::__destruct();//エラーデストラクタ・・・・・}}?>

以上を見ていただくと分かりますが、オートローダーと配列クラスの2つのプログラムが記述されています。

[❶オートローダー]
 オートローダーは、上記のPSR-4の解説でご紹介したものです。各クラスの頭に定義し、インスタンス作成時に当該クラスを呼び出すために利用します。
 機能は、呼び出されたときに、使用するクラスを探し出し、探し出したクラス名は、$classの引数に設定されます。そして、設定された引数を使って、当該クラスをインポートします。
 なお、ここではrequire_onceを利用していますが、通常はComposerを使用するため、require、require_onceなどの記述は不要です。但し、Composerを利用しない場合は、ファイルが何度も読み込まれるリスクがあるため、require_onceを使用することが望ましいでしょう。
 EVEシステムでComposerを利用していませんが、その理由は、バージョンによって仕様が変わる可能性を考慮しているからです。過去の経験から、できるだけ外部ツールには依存しない方向で開発を行っています。

[❷継承]
 このプログラムでは、エラーメッセージクラスを配列クラスが継承しています。エラーメッセージクラスが親で、配列クラスが子となります。
 よく継承の解説を読むと、親子の関係は「動物(親)>哺乳類(子)>犬(孫)」みたいな解説となっており、配列クラスの親がエラーメッセージクラスというのは違和感を感じます。そのため、最初エラーメッセージクラスの機能を各クラスに定義していたぐらいです。ただそれも製造していくうちにうざったくなり、外に出したのですが、その時でさえ、エラーメッセージクラスをインポートしようと考えていました。ただ、ChatGPTにこの問題を相談しているうちに、継承するという方法にたどりつきました。確かにできるのは分かるのですが、やはりピンときません。そういえば、Javaのプログラミングでエラーのクラスを継承していましたね・・・。今まで忘れていました。

[❸デストラクタのオーバーロード]
 最後に親クラス、ここでは、エラーメッセージクラスのデストラクタを呼び出しています。デストラクタは、エラーメッセージクラス、配列クラス双方に定義されており、配列クラスをインスタンス化したときに、エラーメッセージクラスのデストラクタは、配列クラスのデストラクタにオーバーロードされます。そのため、ここではあえて、親クラス、エラーメッセージクラスのデストラクタを呼び出しています。

[あとがき]
 本日は、今日一番時間がかかった、オートローダーについてご紹介しました。この機能つい最近追加されたものかと思ったら、ver5.1の時には利用できたようです。ただ、沢山プログラムがある中、全てのプログラムを変更するのは難しそうです。ただ、オートローダーを作りさえすれば、修正箇所は、3箇所だけなので、知っていればできたかもしれません。やはり、新しいバージョンが出現するたびに、どんな機能ができたのか調べたほうがよさそうです。
 では、また!!!

コメント