サービスデータオブジェクトへのリフレクション

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