Exemples d'agrégation d'objets

Une Association est une combinaison d'éléments construits indépendamment et visibles à l'extérieur. Lorsque nous associons des classes ou objets, chacun garde une référence à l'autre partie de l'association. Lorsque nous associons des classes statiquement, une classe contient une référence à une instance de l'autre classe. Par exemple :

Exemple #1 Association de classes

<?php
class MyDateTime {

  function MyDateTime()
  {
	  // constructeur vide
  }

  function now() 
  {
	  return date("Y-m-d H:i:s");
  }
}

class Report {
  var $_dt;
  // autres propriétés ...

  function Report() 
  {
	  $this->_dt = new MyDateTime();
	  // initialisation du code ...
  }

  function generateReport() 
  {
	  $dateTime = $this->_dt->now();
	  // autre code ...
  }

  // autres méthodes ...
}

$rep = new Report();
?>
Nous pouvons aussi associer des instances dynamiquement, en passant une référence au constructeur (ou par une autre méthode), ce qui permet de gérer dynamiquement l'association entre les objets. Nous allons modifier l'exemple ci-dessus pour illustrer ce point :

Exemple #2 Association d'objets

<?php
class MyDateTime {
  // identique au précédent exemple
}

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;	// Nous allons garder la référence à DateTime ici
  // autre propriété ...

  function Report()
  {
	  // initialisation
  }

  function setMyDateTime($dt) 
  {
	  $this->_dt =& $dt;
  }

  function generateReport() 
  {
	  $dateTime = $this->_dt->now();
	  // autre code ...
  }

  // autres méthodes ...
}

$rep = new Report();
$dt = new MyDateTime();
$dtp = new MyDateTimePlus("l, F j, Y (h:i:s a, T)");

// Génération du rapport avec une simple date
$rep->setMyDateTime($dt);
echo $rep->generateReport();

// plus loin dans le code ...

// Génération du rapport avec une date designée
$rep->setMyDateTime($dtp);
$output = $rep->generateReport();
// sauvegarde pour affichage dans la base
// ... etc ... 
?>

L'agrégation, d'un autre coté, implique l'encapsulation et le masquage des parties de la combinaison. Nous pouvons agréger des classes en utilisant une méthode statique, grâce aux sous-classes (mais PHP ne supporte pas bien les sous-classes), et, dans ce cas, la définition de la classe agrégée n'est pas accessible, sauf via les méthodes de la classe contenant. L'agrégation d'instances (agrégation d'objets) implique la création dynamique de sous-objets à l'intérieur d'un autre objet et, dans le même temps, l'extension des capacités de l'objet principal (en terme de méthodes accessibles).

L'agrégation d'objets est une méthode naturelle pour représenter des relations de type tout-partie (par exemple, une molécule est une agrégation d'atomes), ou bien peut être utilisée pour obtenir un effet équivalent à l'héritage multiple, sans avoir à lier plusieurs classes et leurs interfaces. En fait, les agrégations d'objets sont plus souples, car nous pouvons alors sélectionner les méthodes et les propriétés qui sont transmises à l'objet agrégé.

LoadingChargement en cours