こんにちは!
ナビゲータのEVEです。
本日は、オブジェクト指向プログラミングの継承について学習し、プログラムを作ります。
[継承の目的]
私は、あまり継承の便利さが分かっていませんでした。今回、既存の、Prototype EVEを利用しながら、EVEシステムを作ろうとした場合、そのメリットを大いに感じています。
それは、フレームワークというプログラムにおいて、新旧のシステムにも共通の部分があります。その共通の部分を生かしつつ、新規に追加になる機能のみをプログラミングしていくという方法が取ることが可能なのです。
今回は、新規のシステム、EVEシステムの構想の基に、New Prototype EVEを、EVEシステムを継承することにより作っていきます。
[New Prototype EVEの製造]
Select、FetchはそのままEVEシステムのものを利用できるため、今回継承で、作るメソッドは、Insert、Update、Delete、Transaction、Rollback、Commitになります。早速、Insertのメソッドを作りました。以下がそのプログラムになります。
<?php
require_once "EVESystemDB.php";//DB関連クラス
/*************************************************
*【クラス名 】DB関連クラス(New Prototype EVE)
*【製 造 者】EVE
*【製造年月日】2023年3月17日
*【更新年月日】
*【リリース日】
*【バージョン】
*【 概 要 】
* データベースに関する基本的な機能を提供する
*************************************************/
class getInfDB extends getDB {
//プライベート変数定義
//パブリック変数定義
/*************************************************
*【メソッド名】レコード追加メソッド(New Prototype EVE)
*【 引 数 】
* $tbName:テーブル名
* i_Clum :カラム名(配列)
* i_Data :データ(配列)
*【返 却 値】なし
* 正常時:true
* 異常時:false
*【製 造 者】EVE
*【製造年月日】2023年3月17日
*【更新年月日】
*【リリース日】
*【バージョン】
*【 概 要 】
* レコードを追加する
*************************************************
//レコードを追加する
public function recInsert(string $tbName //テーブル名
array $i_Clum, //追加用項目
array $i_Data) {//追加データ
//変数定義
static $i; //ループインデックス
static $i_array = array();//追加用配列
static $strSql; //SQL文
static $rtn; //返却値
//引数の判定を行う
//テーブル名を判定する
if ( $tbName == "" ) {
//異常の場合メッセージを設定し呼び出し元へ制御を移す
$this->processMessage = "テーブル名が設定されていません";
//呼び出し元へ制御を移す
return false;
}
//配列個数を比較する
if ( count( $i_Clum ) != count($i_Data) ) {
//引数の指定に誤りがある場合
$this->processMessage = "引数の指定に誤りがあります";
//呼び出し元へ制御を移す
return false;
}
//SQL文を編集する
$i_array[] = "insert into ";
$i_array[] = $tbName;
$i_array[] = " (";
//カラム配列終了まで以下の処理を実行する
for ( $i = 0; $i < count( $i_Clum ); $i++ ) {
//カラムを編集する
$i_array[] = $i_Clum[$i];
//最終処理かどうか判定する
if ( count( $i_Clum ) == $i + 1 ) {
//最終処理の場合
$i_array[] = ")";
//forを終了する
break;
} else {
//最終処理でない場合
$i_array[] = ",";
}
}
//データの編集を開始する
$i_array[] = " value (";
//データ終了まで以下の処理を実行する
for ( $i = 0; $i < count( $i_Data ); $i++ ) {
//データを編集を開始する
$i_array[] = "?";
//最終処理かどうか判定する
if ( count( $i_Data ) == $i + 1 ) {
//最終処理の場合
$i_array[] = ");";
//forを終了する
break;
} else {
//最終処理でない場合
$i_array[] = ",";
}
}
//SQL文を編集する
$strSql = implode( "",$i_array );
//SQL文実行処理
try {
//プリシェアードステートメント設定する
$this->stmt = $this->getDbConnect->prepare($strSql);
//バインド変数終了まで以下の処理を実行する
for ( $i = 0; $i < count($i_Data); $i++ ) {
//バインド変数へデータを設定する
$this->stmt->bindParam($i+1,$i_Data[$i]);
}
} catch (PDOException $e) {
//ロールバックする
$this->setRollback();
//検索が失敗した場合
//異常処理結果のメッセージを設定する
$this->processMessage = $e->getMessage();
//返却値を設定して呼び出し元へ制御を移す
return false;
}
//SQL文実行処理
try {
//レコード追加メソッドを実行する
$rtn = $this->stmt->execute();
} catch (PDOException $e) {
//追加処理が失敗した場合
//異常処理結果のメッセージを設定する
$this->processMessage = $e->getMessage();
//返却値を設定して呼び出し元へ制御を移す
return false;
}
//取得したレコード件数を設定する
//返却値を設定し呼び出し元へ制御を移す
return true;
}
}
?>
インターネットで、「コンストラクタは、インスタンス作成時、親クラスのコンストラクタが起動する」と書いてあったので、調査する意味で、EVEシステムのInsertメソッドの部分のみを切り出し、New Prototype EVEとして製造しました。
EVEシステムとPrototype EVEシステムのInsertメソッドの違いは、以下の通りです。
・New Prototype EVEシステムへEVEシステムのDB関連クラスのファイルをインポートしました。
・プリシアードステートメントを設定するところに、try〜catchを入れました。
・トランザクション処理、ロールバック処理、コミット処理を削除しました。
・ドライバのインポートファイルを、New Prototype EVEシステムに変更しました(変更前はEVEシステム)
・インスタンス作成のクラス名をgetDB(EVEシステム)から、getInfDB(New Prototype EVEシステム)に変更しました。
以上のような状態で、前回デバックで利用した2023年3月4日のInsertメソッドを実行したところ、正常に終了しました。
[今回の試験で分かったこと]
以下の点が今回の試験で分かりました。
継承したことにより、親のプロパティ、メソッドを、子は、自身のプロパティ、メソッドとして利用できます。
まだ、たった1本作った後の感想なので、正しいかどうか分かりませんが、明日、予定しているプログラムを作れるところまで作ってみます。そして、過去に作成・利用した試験用ドライバで以上の印象が正しいか、確認します。
では、また!
【このカテゴリーの最新記事】