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