[PHP] データベースclassを使わない理由
篠原 隆司
前回のエントリ【データベース処理を楽にするclass】から続きます。
では、私がこのclassを使わない理由を書いていこうと思います。
といっても、そんなおおげさなもんじゃないですが・・・
一言で書くと、『classを実体化した変数を持ちまわらなきゃいけないから』です。
データベースを使う時って、基本的に保存するデータは全てデータベースに格納するようになります。ってことは、プログラム中のどこのどんな場所でデータベースにアクセスする必要が出てくるか分かりません。
データベースclassをnewした場所と同じスコープで必要になれば良いのですが、スコープが異なるfunction()の中で、または、異なるclassの中でデータベースに接続する必要があるかもしれません。
そのたびに、データベースclassをnewしてコネクションの取得からやり直すでしょうか?
そのたびに、実体化した変数を引数として渡さなきゃいけないのでしょうか?
例えば、Controller でデータベースclassをnewしておいて、ユーザー情報classのコンストラクタに引数で渡すとか?それとも思い切って、データベースclassを実体化した変数をグローバル変数として扱っちゃいますか?
そんなややこしいことをしてコードが煩雑になるよりも、素直にグローバルにしちゃえばいいんですよ。でも、単純にデータベースclassをグローバル変数にしたってしょうがないです。
ところで話が変わって、データベースが2つ以上必要になることってありますか?企業の大規模なシステムや、発注者さんの要望ならあるかもしれませんが、どっちかというと少数派だと思います。特に新規で自分仕様で作成するなら、データベース設計さえきちんとしていればデータベース1つで解決できるんじゃないかと思います。
それと、本当にDBが2つ以上必要な方は、それだけのレベルを持っているということで、旨い解決策をご自身で発見できるものと考えています。
データベースは1つしか使わない
そこで、【データベースは1つしか使わない】という制限を仕様として決めてしまいます。
当然ですが、この制限が可能か将来性も含めて検討したうえでの話です。
データベースを1つしか使わないという制限ができることで、データベースclassの存在価値がなくなります。いや、別に上に書いたようにデータベースclassの実体をグローバルにしても別にいいんですけど・・。その場合って、スコープが代わるたびにイチイチ global $DbClass; なんてしなきゃいけないから、忘れやすいしバグの素なので、オススメはできないです。引数として持ちまわすというのも同じような意味で、面倒なだけです。面倒なコードはすべてバグの素です。
スコープを気にしないfunction()にしてしまう
そこで、ただのfunction()にしてしまうというアプローチをとります。
例えば、
function dbRunSql($Sql){
// sqlを実行して、結果セットをreturn
}
$result = dbRunSql($Sql);
という感じです。
class の外で書かれた function() はスコープを気にせずどこでも使えます。プログラム中のどんな場所からでも、dbRunSql()は呼び出せるので、スコープを気にして"何か"を持ちまわすなんてことを考える必要がなくなります。
余計なコードが無くなるのでスッキリサッパリします。
本エントリは【使わない理由】なので、具体的なコードは次のエントリに書こうと思います。