オブジェクト指向のアプローチが必要な場合は、最近の私のアプローチを次に示します。
私は物事を2つのクラスに分けます。
まず、DatabaseTableクラス-テーブル名、つまりそのテーブルのキーである文字列を受け取ります。次に、DatabaseTableの行を表すDatabaseObjectクラスを作成します。DatabaseObjectには、setFromRowとgetAsRowの2つのルーチンがあります。SetFromRowは、col => valueペアの連想配列からオブジェクトをセットアップし、get as rowは、基本的にオブジェクトをcol=>valueペアとしてシリアル化します。
テーブルでselectメソッドが呼び出されると、DatabaseTableはsetFromRowを使用してDatabaseObjectsを製造します。逆に、データを更新するかテーブルに挿入するように指示されると、DatabsaeTableはgetAsRowを使用してDatabaseObjectをシリアル化します。
通常、発生するのは、独自の特定のオブジェクトのDatabaseObjectから継承し、setFromRowとgetAsRowを定義し、DatabaseTableにインスタンス化するDatabaseObjectの名前が通知されます。
だからあなたが書くことになったのは、コードに関してはこのようなものです
$dbTable = new DatabaseTable('tableName', 'uniqueid', 'InstanceType')
// dbTable manufactures an InstanceType for our use based on the select below
$dbRow = $dbTable->selectUsingId(15);
print_r($dbRow); // Dumps the InstanceTypeObject
これにより、アプリケーション内のデータの表現(DatabaseObject)がデータベーステーブルの管理(DatabaseTable)から分離されます。したがって、私のDatabaseObjectは、C ++の用語では、プレーンな古いデータにすることができます。
もちろん、私が持っているように、テーブル間の関係を作成したり、選択する方法をさらに作成したりすることで、さらに先に進むことができます。
本質的に手続き型言語(SQL)とオブジェクト指向性を統合するのは簡単ではないことを付け加えておきます。そのため、私の方法には欠点があり、それぞれに欠点があるさまざまな答えが得られる可能性があります。