[PHP] データベースclassを使わない理由

アフィリエイト広告を利用しています

このページの内容が役に立ったら X (旧twitter) でフォローして頂けると励みになります
挨拶や報告は無しで大丈夫です

前回のエントリ【データベース処理を楽にする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()は呼び出せるので、スコープを気にして"何か"を持ちまわすなんてことを考える必要がなくなります。
余計なコードが無くなるのでスッキリサッパリします。

本エントリは【使わない理由】なので、具体的なコードは次のエントリに書こうと思います。

次 : データベースを楽にする function()