結果としてオブジェクトを使用することができます。 概要を示す例は 導入 にあります。
しかし、オブジェクトを使用するというのは、 単に結果を配列のかわりにオブジェクトを返すというだけのことではありません。 デフォルトの MDB_QueryTool_Result_Row ではなく、 独自のクラスで結果を返すように登録することができるのです。 登録するクラスは MDB_QueryTool_Result_Row クラスを継承したものである必要があります。
結果のクラスを変更するには setReturnClass
メソッドを使用します。
<?php
require_once 'MDB/QueryTool.php';
require_once 'MDB/QueryTool/Result/Object.php';
define('TABLE_CARS', 'cars');
$dsn = 'mysql://user:pass@host/dbname';
/**
* "car" テーブルに、以下のフィールドがあるものとします
* (id, model, hp, color, clima, price)
*/
class Car extends MDB_QueryTool
{
public $table = TABLE_CARS;
}
class CarEntity extends MDB_QueryTool_Result_Row
{
}
// Car クラスのインスタンスを作成します
$car = new Car($dsn);
$car->useResult('object');
$car->setReturnClass('CarEntity');
?>
これにより、ゲッター/セッター を実装できるようになり、 値へのアクセスを制御できるようになりました。 外部からのクラス変数へのアクセスを拒否するには、 protected として宣言します。private として宣言すると、 外部からだけではなく親クラスからのアクセスも拒否します。 もちろん、そのようにするなら、 対応するメソッドを実装して変数にアクセスできるようにしておかなければなりません。
サンプルを短くまとめるため、model と hp そして clima に関するメソッドのみを実装しました。
<?php
require_once 'MDB/QueryTool.php';
require_once 'MDB/QueryTool/Result/Object.php';
define('TABLE_CARS', 'cars');
$dsn = 'mysql://user:pass@host/dbname';
/**
* "car" テーブルに、以下のフィールドがあるものとします
* (id, model, hp, color, clima, price)
*/
class Car extends MDB_QueryTool
{
public $table = TABLE_CARS;
}
class CarEntity extends MDB_QueryTool_Result_Row
{
protected $id;
protected $model;
protected $hp;
protected $color;
protected $clima;
protected $price;
public function getModel() {
return $this->model;
}
public function setModel($model) {
$this->model = $model;
}
public function getHp() {
return $this->hp;
}
public function setHp($hp) {
$this->hp = $hp;
}
public function getClima() {
if ($this->clima) {
return true;
} else {
return false;
}
}
public function setClima($clima) {
if ($clima) {
$this->clima = 1;
} else {
$this->clima = 0;
}
}
}
// Car クラスのインスタンスを作成します
$car = new Car($dsn);
$car->useResult('object');
$car->setReturnClass('CarEntity');
?>
この例は、基本的な機能を説明しただけのものです。 しかし、これだけでもたとえばデコレータを実装することができるでしょう。 いまどきのオブジェクト指向プログラミングの機能はすべて実装できるようになります。