オブジェクト

オブジェクト --  MDB_QueryTool でオブジェクトを使用する方法

MDB_QueryTool のオブジェクトについて

結果としてオブジェクトを使用することができます。 概要を示す例は 導入 にあります。

しかし、オブジェクトを使用するというのは、 単に結果を配列のかわりにオブジェクトを返すというだけのことではありません。 デフォルトの MDB_QueryTool_Result_Row ではなく、 独自のクラスで結果を返すように登録することができるのです。 登録するクラスは MDB_QueryTool_Result_Row クラスを継承したものである必要があります。

例 1 - デフォルトの結果クラスの変更

結果のクラスを変更するには setReturnClass メソッドを使用します。
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 として宣言すると、 外部からだけではなく親クラスからのアクセスも拒否します。 もちろん、そのようにするなら、 対応するメソッドを実装して変数にアクセスできるようにしておかなければなりません。

例 2 - クラス変数へのアクセスの制限

サンプルを短くまとめるため、model と hp そして clima に関するメソッドのみを実装しました。
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');

考察

この例は、基本的な機能を説明しただけのものです。 しかし、これだけでもたとえばデコレータを実装することができるでしょう。 いまどきのオブジェクト指向プログラミングの機能はすべて実装できるようになります。