Poo - parameterholder class

Soyez le premier à donner votre avis sur cette source.

Snippet vu 3 198 fois - Téléchargée 16 fois

Contenu du snippet

Une classe générique gérant des paramètres qui sont accessibles sous forme de tableaux ou de propriétés.

Source / Exemple :


<?php
/**

  • Class ParameterHolder provides a base class for managing parameters.
* class ParameterHolder extends ArrayObject { /**
  • Constructs an instance of ParameterHolder.
*
  • @param array $parameters Optional, an array of parameters as key/value
  • pair.
  • @return void
  • /
public function __construct(array $parameters = array()) { parent::__construct($parameters, parent::ARRAY_AS_PROPS); } /**
  • Sets the value at the specified index.
*
  • @param string $index The index being set.
  • @param mixed $value The value for the index.
  • @return void
  • /
public function offsetSet($index, $value) { if (is_array($value)) { $value = new static($value); } parent::offsetSet($index, $value); } /**
  • Returns the value at the specified index.
*
  • @param string $index The index with the value.
  • @return mixed Returns the value at the specified index or FALSE.
  • /
public function offsetGet($index) { $value = parent::offsetGet($index); if (is_array($value)) { $this->offsetSet($index, $value); return parent::offsetGet($index); } return $value; } } // Example: $initParams = array('third_section' => array('php_version' => PHP_VERSION)); $parameterHolder = new ParameterHolder($initParams); $parameterHolder['first_section'] = array(); $parameterHolder['first_section']['one'] = 1; $parameterHolder['first_section']['two'] = 2; $parameterHolder->second_section = array(); $parameterHolder->second_section->path = '/path/to/something'; $parameterHolder->second_section->url = 'http://php.net/'; // prints: 1 echo $parameterHolder->first_section->one; // prints: /path/to/something echo $parameterHolder['second_section']['path']; // prints: 5.3.0 echo $parameterHolder->third_section->php_version; // prints: 5.3.0 echo $parameterHolder['third_section']['php_version']; // prints: bool(true) var_dump(isset($parameterHolder->second_section->path)); unset($parameterHolder->second_section->path); // prints: bool(false) var_dump(isset($parameterHolder->second_section->path)); // prints: //ParameterHolder Object //( // [storage:ArrayObject:private] => Array // ( // [third_section] => ParameterHolder Object // ( // [storage:ArrayObject:private] => Array // ( // [php_version] => 5.3.0 // ) // ) // [first_section] => ParameterHolder Object // ( // [storage:ArrayObject:private] => Array // ( // [one] => 1 // [two] => 2 // ) // ) // [second_section] => ParameterHolder Object // ( // [storage:ArrayObject:private] => Array // ( // [url] => http://php.net/ // ) // ) // ) //) print_r($parameterHolder); ?>

A voir également

Ajouter un commentaire

Commentaires

Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
15
Pas de quoi pour le coup de pouce ^^
Pour l'erreur à la con sur offsetSet(), j'ai une excuse monsieur le juge, j'étais debout depuis minuit et demi, j'étais donc en fin de journée, prêt à me coucher... Bon, je suppose que tu as réussi à la déboguer tout seul ;)
Messages postés
22
Date d'inscription
vendredi 8 janvier 2010
Statut
Membre
Dernière intervention
19 février 2010

Okay, il est vrai que remplacer tout les tableaux par une instance de "ParameterHolder" dès l'instanciation si l'on passe un tableau multidimensionnel peut s'avérer lourd. Un mixte des deux, on change un tableau par une instance de "ParameterHolder" uniquement lorsqu'on tente de y accéder, puis on le réaffecte à l'index spécifié pour une utilisation future. Enfin, toutes nouvelles valeurs passées sous forme de tableau sont également remplacées par une instance de "ParameterHolder", sinon, le chainage "$parameterHolder['first_section']['one']" fonctionne, mais pas celui-çi "$parameterHolder->second_section->path". Merci pour le coup de pouce ;)

NB : ArrayObject::offsetSet() expects exactly 2 parameters, 1 given ;)
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
15
Voui, le résultat est le même.
Sauf que ta manière de définir les "propriétés" dans le constructeur ne me plaît qu'à moitié : dans l'idée, elle dispense de surcharger offsetGet(), mais... je trouve ça lourd. Alors que si tu te contentes de passer le tableau du constructeur au constructeur parent (celui de ArrayObject donc) alors tu peux retourner des instances de ArrayObject instanciées à la volée. Eventuellement, tu peux remplacer les tableaux de dimension > 1 par une instance de ArrayObject, manière de faire un "semblant de cache" (pour ne pas réinstancier 30 fois un ArrayObject si on tente d'accéder plusieurs fois à une propriété tableau. Je suis pas certain d'être clair... Je vais tenter un bout de code.

public function offsetGet($offset) {
$return = parent::offsetGet($offset);
if (is_array($return)) {
$return = new static($return);
$this -> offsetSet($return);
}
return $return;
}

Ca revient au même que de le faire dans le constructeur, sauf que comme ça, on ne le fait que pour les propriétés auxquelles on accède.
Après, c'est juste une question de goût ^^
Messages postés
22
Date d'inscription
vendredi 8 janvier 2010
Statut
Membre
Dernière intervention
19 février 2010

Je suis d'accord avec toi, on peut redéfinir la méthode "offsetGet" afin qu'elle retourne une instance "ArrayObject" si la valeur est un tableau, ce qui permet bien le chaînage "$params['first_section']['one']" ou "$params->second_section->path" MAIS UNIQUEMENT si l'on a déjà passé ces paramètres sous forme de tableau au constructeur.

Hors, je souhaitais pouvoir garder la possibilité de définir des paramètres non-définies lors de l'instanciation de la classe, tout en ayant cette possibilité de chainage.

Pour cela, c'est la méthode "offsetSet" qui doit être redéfinie, ainsi que le constructeur, cf. modification de la source.
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
15
Ah ! Je me disais aussi ^^

Pour mes besoins perso, j'ai utilisé également ArrayObject avec le flag ArrayObject::ARRAY_AS_PROPS. Par contre, j'ai surchargé la méthode offsetGet pour que si l'élément est un tableau, il renvoit une instance d'ArrayObject, avec le même flag.
Par contre, je charge dans l'instance directement un tableau lu dans un fichier de config, parce qu'en réalité, ça n'a pas beaucoup de sens de définir des variables dans le script qui charge la config...
Afficher les 8 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.