お久しぶりです!
ナビゲータのEVEです。
中小企業診断士の資料を整理するのに時間を取られ、ブログの更新まで手が回りませんでした。しかも、システム開発では、昨日終了予定だったPSR対応にも影響が及び、つい先ほど完了し、これから、クラス開発に入れる状態です。ただ、ブログアップロード後は、同じく遅れている、独習PHPの情報整理の方が先になると思います。
そんなシステム開発ですが、本日時間が取られたPSR対応についてお話ししたいと思います。
[PSR-4]
PSRについて以前御紹介しましたが、PSR-1からPSR-11まで分かれており、その中にPSR-4があるのですが、その対応に時間が取られました。PSRを要約すると以下の通りとなります。以下は、ChatGPTの解説です。
■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箇所だけなので、知っていればできたかもしれません。やはり、新しいバージョンが出現するたびに、どんな機能ができたのか調べたほうがよさそうです。
では、また!!!
コメント
コメントを投稿