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

2018年5月8日

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

今回はDbManagerクラスということでやっていきたいと思います。

このクラスでは、PDOでのデータベースとの接続処理ということをやっていくのだが、このPDOについてはかなり以前、フレームワークを始める前に一度PDOでの接続処理に挑戦した記憶がある。

そのときには、phpもやり始めたばかりで全く意味がわからなかったことを記憶しているが、俺がphpを始めて約2カ月。。毎日こつこつ勉強していればレベルというのは勝手に上がっていくものだ。

とは言いながらまだまだ初心者なので、わからないことの方がはるかに多いことに変わりはない。これからも勉強頑張ろう。

話は逸れたが、今回は久しぶりにPDOのお話だ。以前のブログに何を書いたのか全く記憶にないし、今見ると多分恥ずかしくなるので振り返らないままPDOについて軽く説明しておく。

PDOとは、データベース接続処理に関するライブラリのことらしい。

本来データベースとの接続処理は、各データベース毎に構文を変更する必要があるが、このPDOってやつは、どのデータベースであっても同じ構文で処理できるようになっている。

まさにオブジェクト指向向けの処理だ。

PDOについては調べればたくさんでてくるので、ここで一々長々説明するのはやめてそろそろsrcの説明について、話していきたいと思う。

今回のSrcがこちら、といっても一部なのだが、DbManagerクラスは結構長い。。。

srcを書くだけでも一苦労なのだ。一体何から話していけばよいのか。

ゆっくり気長に上からやっていこう。

・connect()メソッド

まずは、クラスの一番上のプロパティを見て欲しい。$connectionというプロパティがあり、このプロパティは空の配列が初期化されている。

この空の配列に値をいれるのが、このメソッドの役割だ。では、どのような値を配列にいれるのか。それは、PDOのインスタンスだ。

これを連想配列で保持する。 [キー] => PDOのインスタンス  こんな具合だ。

正直PDOのインスタンスを配列で保持するという意味が俺自身もよくわかっていないのだが、多分このくらいのことは、本を読み進めているうちに解決すると思っているので、放置している。笑(テッキトー)なので、解決した時点で皆さんにお伝えしますね!

話を戻すが、このconnect()メソッドは引数に先ほど話した連想配列のキーの名前と、PDOの接続処理に必要な「データベース名」・「ユーザー名」・「パスワード」等の配列を引数として受け取る。

受け取った引数の配列は、このメソッド内で初期化されている連想配列にarray_mergeされ$paramsに格納された後、’dsn’・’user’・’password’・’opions’それぞれのキーを元にした値をPDOに引数として渡し、$conにPDOをインスタンス化することで、接続処理が完了する。

更に$conには、setAttributeにより、エラーレポートと、例外の属性を設定している。

これが完了すると、連想配列$connectionsに最初に引数として渡したキー名の値に$conが値として入る仕組みになっている。

まぁ、あの見たまんまだね。今日は夜も遅いので挙動を確認する気も起きないが、多分そんな感じであってる笑

・getConnection()メソッド

このメソッドには引数として、「$name」つまり先ほどのPDOのインスタンスのキーを渡すのだが、引数を渡さなければ「null」が初期化されている。

このメソッドでは、引数に指定したキーのインスタンスが戻り値として返ってくるようになているが、もし引数が渡されていない場合は、current()関数により配列の最初のキーのインスタンスが返されるようになっている。

・setRepositoryConnectionMap()メソッド

パーフェクトphpにも書いてあるのだが、このメソッドは1つのデータベースしか使用しないアプリの場合は意味のない機能らしい。

ぱっとしか見ていないが確か本編もデータベースは1つだと思うので軽く説明してみる。

このメソッドには引数に後に実装するRepositoryクラス(フレームワークではなく、アプリ側の子クラス)の名前と、先ほど上で説明したPDOのインスタンスのキーを引数で渡す。

すると更に今度はRepositoryクラスの名前をキーとして、値をPDOのインスタンスのキーとした配列を、$repository_connect_mapに格納する。

・getRepositoryConnectionMap()メソッド

このメソッドの引数には、上で書いたsetRepositoryConnectionMap()メソッドと同様、Repositoryクラスの名前を引数で渡す。

もし、その引数に指定された名前のキーがsetRepositoryConnectionMap()メソッドで作成された配列、$repository_connect_mapの中にあれば、その値をgetConnection()メソッドの引数として渡し、指定したキーのインスタンスを戻り値として受け取る。

もし$repository_connect_mapの中になければ、getConnection()メソッドを引数なしで実行する為、current()関数により配列の最初のキーのインスタンスが返されるようになっている。

 

という風な仕組みとなっている。今回は画像も用意せず、かなり文字が多めになってしまった為、わかりにくい表現があったかもしれないが、もし何かあればコメントお待ちしております。

DbManagerクラスは長いので、今回はここまでとして次回またこの続きをやっていきたいと思う。