## プロパティの値の設定および取得

以下の例では、上で示したスキーマおよびインスタンスドキュメントをもとに 作成したデータオブジェクトツリーのルート要素が $company に入っているものとして考えます。

例1 プロパティ名を使用したアクセス

データオブジェクトのプロパティへは、通常のオブジェクトの プロパティにアクセスするのと同じ構文でアクセス可能です。 以下の例では、会社の名前を 'Acme' に変更します。

`<?php
$company->name = 'Acme';
?>`

例2 配列のインデックスを使用したプロパティへのアクセス

連想配列形式の構文を使用して、プロパティにアクセスすることもできます。 最も簡単な方法は、プロパティ名を配列のインデックスとして使用する方法です。 例えば、以下の例では会社の名前を設定してから「今月の従業員」を取得しています。

`<?php
$company['name'] = 'UltraCorp';
$eotm = $company['employeeOfTheMonth'];
?>`

例3 データオブジェクトの繰り返し処理

foreach を使用することにより、データオブジェクトのプロパティを 順に処理していくことができます。以下の例では、 今月の従業員のプロパティを順に処理します。

`<?php
$eotm = $company->employeeOfTheMonth;
foreach ($eotm as $name => $value) {
echo "$name: $value\n";
}
?>`

出力は以下のようになります。

    name: Jane Doe
    SN: E0003

'manager' プロパティは表示されません。なぜなら設定されていないからです。

例4 多くの値をとりうるプロパティへの名前によるアクセス

多くの値をとりうるデータオブジェクトのプロパティへのアクセスも、 オブジェクトのプロパティに対するアクセス構文でアクセスできます。 例えば部署の一覧を取得するにはこのようにします。

`<?php
$departments = $company->departments;
?>`

例5 多くの値をとりうる要素へのアクセス

配列の構文を使用することで、多くの値をとりうる要素における 個々の要素にアクセスすることが可能です。以下の例では、 会社の中の最初の部署にアクセスしています。

`<?php
$ad_tech_dept = $company->departments[0];
?>`

例6 多くの値をとりうるプロパティの順次処理

foreach を使用して、多くの値をとりうるプロパティを順に処理することができます。 会社の各部門を順に処理するにはこのようにします。

`<?php
foreach ($company->departments as $department) {
// ...
}
?>`

繰り返しのたびに、次の部署が変数 $department に代入されます。

例7 連結されたプロパティへのアクセス

プロパティへの参照を、ひとつの行に連結することができます。 以下の例では、最初の部署の名前を設定し、取得しています。

`<?php
$company->departments[0]->name = 'Emerging Technologies';
$dept_name = $company->departments[0]->name;
?>`

同じことを連想配列構文で行うと、このようになります。

`<?php
$company['departments'][0]['name'] = 'Emerging Technologies';
$dept_name = $company['departments'][0]['name'];
?>`

どちらの場合でも、dept_name の内容は 'Emerging Technologies' となります。

例8 XPath によるナビゲーション

連想配列のインデックスとして、XPath 風の式を使用することができます。 実際に使用できる式は、XPath の拡大サブセットです。

多くの値をとりうるプロパティの表す方法として、 2 通りの方法がサポートされています。 最初の方法は、1 から始まる標準的な XPath の配列構文を使用するものです。 もうひとつは、SDO で XPath を拡張した構文で、 ゼロから始まるインデックスを使用します。 標準的な構文は以下のようになります。

`<?php
$jane_doe = $company["departments[1]/employees[2]"];
?>`

そして SDO の拡張版 XPath 構文はこのようになります。

`<?php
$jane_doe = $company["departments.0/employees.1"];
?>`

どちらの例でも、最初の部署の 2 番目の従業員を取得します。

例9 XPath による問い合わせ

XPath を使用して、インスタンスのデータ内のデータオブジェクトを 検索することができます。以下の例では、部署 'Advanced Technologies' の manager を取得しています。

`<?php
$ad_tech_mgr =
$company["departments[name='Advanced Technologies']/employees[manager=true]"];
?>`

例10 子オブジェクトの作成

データオブジェクトは、自分自身の中に子オブジェクトを保持することが できます。子データオブジェクトは自動的にデータグラフの一員となります。 以下の例では、部署 'Advanced Technologies' に新しい従業員を追加しています。

`<?php
$ad_tech_dept = $company["departments[name='Advanced Technologies']"];
$new_hire = $ad_tech_dept->createDataObject('employees');
$new_hire->name = 'John Johnson';
$new_hire->SN = 'E0005';
$new_hire->manager = false;
?>`

例11 プリミティブなプロパティの開放

データオブジェクトに項目が登録されているかどうかを確かめたり 項目を削除したりする際には、それぞれ isset() および unset() 関数が使用可能です。

以下の例は、最初の部署の名前を消去します。

`<?php
unset($company->departments[0]->name);
?>`

例12 データオブジェクトの開放

unset は、ツリーからデータオブジェクトを削除する場合にも使用できます。 以下の例は、John Jones を会社から削除します。

`<?php
unset($company->departments[0]->employees[0]);
?>`

例13 参照されているデータオブジェクトの開放

以下の例では、会社から「今月の従業員」を削除します。 もしこれらの間に包含関係があった場合、参照先の従業員も 削除されてしまいます (その月の一番優秀な従業員を毎月クビにしていく なんてバカなことは、普通はしないでしょう!)。 しかし実際にはこれらは包含関係ではないので、参照先の 従業員は会社の中の部署の中に残り続けます。ただ、 employeeOfTheMonth プロパティを通じてはアクセスできなくなります。

`<?php
if (isset($company->employeeOfTheMonth)) {
unset($company->employeeOfTheMonth);
}
?>`

例14 プロパティのインデックスを使用したアクセス

配列構文を使用して、プロパティのインデックス経由で データオブジェクトのプロパティにアクセスすることができます。 プロパティのインデックスは、モデル (この場合は xml スキーマ) 内でそのプロパティの定義が現れる位置となります。 上のスキーマの例では、会社の名前が company の 2 番目の属性であることがわかります (SDO のインターフェイスは、 XML の要素と属性を区別しません)。以下の例では、 会社の名前を 'Acme' に設定します。これは プロパティ名を使用したアクセス と同じ結果となります。

`<?php
$company[1] = 'Acme';
?>`

このようにインデックスを直接使用すると、後で破綻してしまう可能性があります。 通常はプロパティ名を使用する方式を推奨します。 しかし、時にはインデックスによるアクセスが必要になる場合もあるでしょう。