PHP フレームワーク DbManager.php 作成 (2)

2018年5月8日

みなさんこんにちは!タカモリです。

前回からですね、データベースに関連する処理をやっているのですが、非常に

眠い!!

このデータベースに関連する処理はこの後しばらく続くのですが、確かにデータベース接続はwebサイトの要と言っていいほど重要なことで、これがなくては、成り立たないというほどのものですが、なんしかジミ!

フレームワークはただでさえ、実行の挙動が確認しにくいのに。。。srcをただ読むだけ。みたいな感じになってますね。

今回もただsrcを読むだけみたな感じで進めていくので、見たくない方は見ないで下さい。

難しいことも特にないとは思います。

ということで、今回のsrcがこちら。

前回の続きですね。

このメソッドではこの後作成していく、今回、プロパティの画像を用意していないのですが、DbRepositoryクラス(DbRepositoryクラス自体は抽象クラス)の子クラスのインスタンスを作成し、それを「repositories」という連想配列のプロパティに格納していくということをやっていきます。

例えば、アプリ側でUserRepositoryクラスというのを作成した場合には [UserRepository]=> 指定したデータベースのオブジェクト みたいな感じで作るわけですね。

ではDbRepositoryクラスと言うのはDbManagerクラスで接続したデータベースに命令文を発行するクラスという認識でいいと思います。

・get()メソッド

というわけでメソッドの話しに戻しますが、このget()メソッドでは引数にDbRepositoryクラスの子クラスの名前を引数として渡すことになる。

UserRepositoryクラスであれば、「User」が引数となるわけだ。そのままsrcを日本語に直していくと、配列repositoriesプロパティのキーに[User]といキーがなければ、Userの後にRepositoryという文字列をくっつけて、$repository_classに保有する。

そして、getConnectionForRepositoryの引数にUserを渡し実行した結果を$conに代入する。

getConnectionForRepositoryが何かわかりにくいので、画像を貼っておく。

お!まだメソッドが中に隠れていたのでもう一枚貼っておく。

getConnectionForRepositoryでは、Userというキーのデータベースのインスタンスがない場合は、配列の最初のデータベースのインスタンスを返すということになり、それをget()メソッドでは$conに代入する。

$conにはデータベースのインスタンスが単品で格納されているわけなのだが、上で作成している$repository_class(この場合、中身はUserRepository)の引数に$conを渡し、インスタンス化したものを$repositoryとして保有し、連想配列$repositoriesに格納、その際にキーはDbRepositoryクラスの子クラスの名前、値が、そのデータベースのインスタンスとなるわけだ。

最初にも書いたが、[UserRepository] => 指定したデータベースのオブジェクト のような結果に繋がるわけだ。

このget()メソッドが呼ばれたときには、連想配列$repositories [UserRepository] を返すこととなる。

ということで、少しわかりにくい説明にはなってしまったが、おそらくこれは次にやるDbRepositoryクラスに入ると理解が深まるはずだ!俺も含めて。

というわけで、このメソッドはこのへんにしておく。

・__destruct()メソッド

これもこのクラスに限った話ではないのだが、__destrct()メソッドというのは、そのオブジェクトのインスタンスが消滅したときに必ず実行される処理にあたる。__constructと逆の処理だ。

このクラスでの処理はデータベースの解放処理となる。

このメソッドに用意されているunset()関数は、その変数の解除を担当する関数だ。

foreachで配列から、1つ1つの値を通りだし、解除していく仕組みとなっている。

$repositoriesにはRepositoryクラスのインスタンスが入っているので、まずはそれを解除し、続いて、PDOのインスタンスを保持している$connctionsを解放している。

アプリが終了されるときには、自動的にデータベースとの接続は解放されるらしいのだが、プログラミングの世界では、この接続の解放処理は礼儀らしい。

ということで、今回これでやっとこさDbManagerクラスは終わったわけだ。

次からはまたもやデータベースに関連するDbRepositoryクラスをやっていきたいと思う。