Version 1.0.0 - 2006/01/31

4.3 Réflexion et traitements dynamiques

Il serait inimaginable de réaliser un tel framework sans l’aide de la réflexion et des traitements dynamiques. Autant le développeur connaît les signatures des méthodes, le nom des classes et leur emplacement à l’avance, autan le framework à besoin de plus de souplesse  pour anticiper et s’adapter à tous les projets. C’est la raison pour laquelle une bonne partie du travail du développeur consistera à faire des déclarations (de classes, de propriétés, etc.).
Le framework met à votre disposition des méthodes pour traiter la réflexion et effectuer des traitements dynamiques. Il faut garder à l’esprit qu’elles sont réservées à la plate-forme, ne les utiliser quand cas d’extrême nécessité. Préférez leur toujours les solutions statiques quand cela est possible.

Le listing suivant illustre un exemple d’utilisation des traitements dynamiques. Il s’agit de retrouver et d’utiliser la meilleure version disponible de la classe exemple.OfficeCustomer. Le chargement de la définition de classe n’est généralement pas nécessaire pour les objets créés dynamiquement. Nous testons si la meilleure version est disponible sur l’ensemble du chemin de classes en utilisant la méthode Noas ::exist(). Si le test est positif nous créons dynamiquement une instance de exemple.OfficeCustomer2, dans le cas contraire nous utilisons l’ancienne version.

Création dynamique d'un objet

<?php
Noas::import('exemple.OfficeCustomer') ;

$oOfficeCustomer = null;
if(Noas::exsit('exemple.OfficeCustomer2')){
  $oOfficeCustomer =
              Noas:: createDynamicObject ('exemple.OfficeCustomer2');
}else{
  $oOfficeCustomer = new OfficeCustomer();
}

?>
En programmation orientée objet le développeur à besoin de manipuler les propriétés et les méthodes de manière dynamique. Cela est d’autant plus vrai que dans le framework pour communiquer avec le développeur il y a recourt à la réflexion. Le jargon est bien rodé, mais une nouvelle expression nécessite une explication. Il s’agit de « chemin de propriété » ou encor « chemin d'accès ». Elle représente une liste ordonnée de propriétés séparées par « / ». A l’instar des dossiers et des fichiers, vous pouvez spécifier la « localisation » d’une valeur dans la hiérarchie des objets. Vous pouvez évaluer cette expression sur un objet grâce à la méthode Noas :: getObjectByPath().


Le listing suivant nous montre l’exemple d’une classe exemple.client qui possède un attribut de type exemple.OfficeCustomer qui elle-même possède un attribut « number » de type entier.

Client.class.php

<?php
Noas::import('exemple.OfficeCustomer');
class Client {
  private $oOfficeCustomer;
...  
  function __construct(){
    $this->oOfficeCustomer = new OfficeCustomer();
  }
  public function getOfficeCustomer(){
    return $this->oOfficeCustomer;
  }
  public function setOfficeCustomer($oOfficeCustomer){
    $this->oOfficeCustomer = $oOfficeCustomer;
  }
...
}
?>
Nous voyons grâce au listing suivant plusieurs façons d’accéder aux valeurs des attributs par réflexion. Dans cet exemple, les trois variables « $number1», « $number2 », « $number3» ont la même valeur.

Accès aux attributs par réflexion

<?php
Noas::import('exemple.Client');
...
$oClient = new Client();
...
$number1 = $oClient->getOfficeCustomer()->getNumber();
$number2 =      
               Noas::getObjectByPath($oClient,'officeCustomer/number');
$oOfficeCustomer = Noas::getter('officeCustomer',$oClient);
$number3 = Noas::invoke($oOfficeCustomer, Noas::getGetterMethod('number'));
...
?>

 

© 2005 Réoka Djohou, tous droits réservés.