関連は、独立に構築され、外部から 可視の部分を合成したものです。クラスまたはオブジェクトを 関連づける場合、各クラスは関連するクラスへのリファレンスを保持します。 複数のクラスを静的に関連づける場合は、クラスは他のクラスの インスタンスへのリファレンスを含みます。例えば、
例1 クラスの関連付け
<?php
class MyDateTime {
function DateTime()
{
// 空のコンストラクタ
}
function now()
{
return date("Y-m-d H:i:s");
}
}
class Report {
var $_dt;
// その他のプロパティ ...
function Report()
{
$this->_dt = new MyDateTime();
// 初期化コード ...
}
function generateReport()
{
$dateTime = $this->_dt->now();
// その他のコード ...
}
// その他のメソッド ...
}
$rep = new Report();
?>
コンストラクタ (または他のメソッド) にリファレンスを渡すことにより 実行時に複数のインスタンスを関連づけることも可能です。 これにより、複数のオブジェクト間の関連を動的に変更することが 可能です。この例を示すために上の例を変更してみます。
例2 オブジェクトの関連
<?php
class MyDateTime {
// 上の例と同じ
}
class MyDateTimePlus {
var $_format;
function MyDateTimePlus($format="Y-m-d H:i:s")
{
$this->_format = $format;
}
function now()
{
return date($this->_format);
}
}
class Report {
var $_dt; // MyDateTime へのリファレンスをここに保持
// その他のプロパティ ...
function Report()
{
// 初期化を行う
}
function setMyDateTime(&$dt)
{
$this->_dt =& $dt;
}
function generateReport()
{
$dateTime = $this->_dt->now();
// その他のコード ...
}
// その他のメソッド ...
}
$rep = new Report();
$dt = new MyDateTime();
$dtp = new MyDateTimePlus("l, F j, Y (h:i:s a, T)");
// Web 表示用に簡単な日付を付けたレポートを生成する
$rep->setMyDateTime($dt);
echo $rep->generateReport();
// その他のコード ...
// かっこの良いレポートを生成する
$rep->setMyDateTime($dtp);
$output = $rep->generateReport();
// データベースに $output を保存
// ... 等 ...
?>
一方、集約では、合成されたパーツのカプセル化 (隠蔽) が行われます。(静的な) 内部クラス (PHP はまだ内部クラスを サポートしていません) を使用することにより、クラスを集約することが できます。この場合、このクラスを含むクラスを通じる場合以外、集約された クラスの定義にはアクセスできません。複数のインスタンスの集約 (オブジェクト集約) は、あるオブジェクトの内部にサブオブジェクトを 動的に作成することを意味し、この過程でこのオブジェクトのプロパティと メソッドを拡張します。
オブジェクトの集約は、(例えば、分子は原子を集約したものであるといった) 包含関係を表す際の自然な方法であり、サブクラスを複数の親クラス およびそのインターフェイスに永続的にバインドすることなく、 多重継承と等価な機能を得るために使用できます。 実際、オブジェクトの集約はより柔軟に使用することができ、集約される オブジェクトで継承するメソッドまたはプロパティを選択することが できます。