Avertissement |
Ce module est EXPERIMENTAL. Cela signifie que le comportement de ces fonctions, leurs noms et, concrètement, TOUT ce qui est documenté ici peut changer dans un futur proche, SANS PREAVIS ! Soyez-en conscient, et utilisez ce module à vos risques et périls. |
En programmation objet, il est courant de rencontrer la combinaison de classes simples (et de leurs instances) en une classe plus complexe. C'est une strategie habile pour mettre en place des objets complexes, et des hiérarchies d'objets. Ce système peut fonctionner comme une alternative dynamique à l'héritage multiple. Il y a deux solutions pour combiner deux classes, suivant la relation de leurs éléments constitutifs : L'Association et l'agrégation.
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 2. Association d'objets
|
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é.
Nous définissons trois classes, qui implémentent chacune une méthode de stockage différente :
Exemple 3. storage_classes.inc
|
Puis, nous "instantions" quelques objets issus de ces classes, et nous réalisons des agrégations et désagrégations, tout en affichant quelques résultats :
Exemple 4. test_aggregation.php
|
Etudions maintenant le résultat du script pour comprendre les effets
secondaires et les limitations des agrégations d'objets en PHP.
D'abord, nous avons créé $fs
et $ws
et ils fournissent le bon résultat (suivant la définition de leur classe).
Notez que dans le but de l'agrégation d'objets,
les éléments privés d'une classe ou
d'un objet doivent commencer par un souligné ("_"),
même s'il n'y a pas de distinction réelle entre un objet
privé et un objet public.
Exemple 5. agrégation d'objets
|
Nous agrégeons alors $fs
avec la classe
WDDXStorage, et nous affichons les informations.
Nous pouvons aussi voir que même si l'objet $fs
est toujours du type FileStorage, il a maintenant
la propriété $version
, et la méthode
store(), qui sont définies dans
WDDXStorage. Une chose importante à noter est
que les éléments privés n'ont pas été
agrégés, même s'ils sont présents dans l'objet
$ws
. Un autre absent est le constructeur de
WDDXStorage, qu'il n'est pas logique d'agréger.
Le processus d'agrégation est cumulatif, ce qui fait que
lorsque nous agrégeons $fs
avec la classe
DBStorage, nous générons un objet qui
peut utiliser n'importe laquelle des méthodes de stockage de
ces classes.
Exemple 7. Accumulation dans une agrégation
|
Finalement, de la même façon que nous avons agrégé
les méthodes et propriétés dynamiquement, nous pouvons aussi
les désagréger. Si nous désagrégeons
la classe WDDXStorage de l'objet $fs
,
nous allons obtenir :
Un point que nous n'avons pas mentionné ci-dessus et que l'agrégation ne va
pas écraser les méthodes ou propriétés déjà existantes dans l'objet principal.
Par exemple, la classe FileStorage définit une
propriété $data
, et la classe
WDDXStorage aussi. Mais cette dernière ne sera pas
impliquée dans l'agrégation.
Précédent | Sommaire | Suivant |
nsapi_virtual | Niveau supérieur | aggregate_info |