SDO は、自分自身を作成するもととなったオブジェクト (モデル) の構造を知っています。例えば、上の Company XML スキーマ を使用して 作成した Company SDO には DepartmentType データオブジェクトしか 含めることはできず、同様に DepartmentType データオブジェクトには EmployeeType データオブジェクトしか含めることはできません。
実行時にモデルの情報にアクセスできると、以下のような利点があります。 例えば、データオブジェクトに値を設定するためのユーザーインターフェイスを 自動的に作成することができます。モデルの情報にアクセスするには、 リフレクションを使用します。
例1 データオブジェクトへのリフレクション
以下の例では、空の Employee データオブジェクトへのリフレクションの 方法を示します。
<?php
// employee データオブジェクトを (例えば XML データアクセスサービスなどから) 作成します
$employee = ...;
$reflection = new SDO_Model_ReflectionDataObject($employee);
print($reflection);
?>
上の例の出力は以下となります。
object(SDO_Model_ReflectionDataObject)#4 { - ROOT OBJECT - Type { companyNS:EmployeeType[3] { commonj.sdo:String $name; commonj.sdo:String $SN; commonj.sdo:Boolean $manager; } }
SDO_Model_ReflectionDataObject に対して print を使用すると、 データオブジェクトのモデルを出力します。この出力結果から、 companyNS:EmployeeType 型には 3 つのプロパティがあることや それぞれのプロパティの名前と型を知ることができます。 プリミティブ型は、SDO の型として表示されることに注意しましょう (例: commonj.sdo namespace, String type)。これは SDO モデルであり、 アプリケーションからは PHP の同等の型 (例: string および boolean) として扱えることを知っておくとよいでしょう。
例2 型情報へのアクセス
リフレクションを使用して、データオブジェクトの型情報を取得することが できます。以下の例では、まず型がプリミティブ型ではなく データオブジェクトに対応するものであることを確認し、各プロパティの 名前を書き出しています ($type および $property は、それぞれ SDO_Model_Type および SDO_Model_Property オブジェクトです)。
<?php
// employee データオブジェクトを (例えば XML データアクセスサービスなどから) 作成します
$employee = ...;
$reflection = new SDO_Model_ReflectionDataObject($employee);
$type = $reflection->getType();
if (! $type->isDataType()) {
foreach ($type->getProperties() as $property) {
print $property->getName() . "\n";
}
}
?>
上の例の出力は以下となります。
name SN manager