PHP Manual

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

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


PHP Manual