begin process at 2012 05 27 18:05:31
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Class et Objet ( POO )

 > POO - PARAMETERHOLDER CLASS

POO - PARAMETERHOLDER CLASS


 Information sur la source

Note :
Aucune note
Catégorie :Class et Objet ( POO ) Classé sous :Poo, Class, Parameter, Holder Niveau :Débutant Date de création :08/01/2010 Date de mise à jour :13/01/2010 13:40:42 Vu :1 989

Auteur : Waredan

Ecrire un message privé
Commentaire sur cette source (8)
Ajouter un commentaire et/ou une note

 Description

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

Source

  • <?php
  • /**
  • * Class ParameterHolder provides a base class for managing parameters.
  • *
  • * @author Quentin Berlemont <quentinberlemont@gmail.com>
  • * @copyright Copyright (C) 2010 Quentin Berlemont
  • * @license http://www.gnu.org/licenses/lgpl.html LGPLv3
  • */
  • 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);
  • ?>
<?php
/**
 * Class ParameterHolder provides a base class for managing parameters.
 *
 * @author     Quentin Berlemont <quentinberlemont@gmail.com>
 * @copyright  Copyright (C) 2010 Quentin Berlemont
 * @license    http://www.gnu.org/licenses/lgpl.html LGPLv3
 */
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);
?>



 Historique

12 janvier 2010 17:06:19 :
Simplification :)
12 janvier 2010 17:07:03 :
coloration syntaxique :$
13 janvier 2010 10:03:19 :
Modification du constructeur et de la manière de récupérer les valeurs de type tableau. (Big up à Neigedhiver ;p pour l'idée)
13 janvier 2010 10:06:54 :
Correction mineure ..
13 janvier 2010 13:40:42 :
La source passe de "initié" à "débutant" :p

 Sources du même auteur

Source avec Zip POO - LOGGING PACKAGE
POO - OBJECT CLASS
Source avec Zip POO - FACTORY CLASS
POO - SINGLETON CLASS

 Sources de la même categorie

Source avec Zip GÉNÉRATION AUTOMATIQUE DE FICHIER .CLASS.PHP EN FONCTION D'U... par ig3
CLASSE D'OBJET DE CRYPTAGE ET DÉCRYPTAGE DE CHAINES DE CARAC... par 8Tnerolf8
Source avec Zip MY.DEVIANTART API par inwebo
CLASSE DE GESTION DE "VARIABLES GLOBALES D'ENVIRONNEMENT" par pifou25
Source avec Zip COLLECTION.CLASS.MIN.PHP par thunderhunter

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture MY.EXCEPTION par inwebo
Source avec Zip POO - LOGGING PACKAGE par Waredan
POO - OBJECT CLASS par Waredan
Source avec Zip POO - FACTORY CLASS par Waredan
POO - SINGLETON CLASS par Waredan

Commentaires et avis

Commentaire de neigedhiver le 08/01/2010 13:15:33

Salut,

Je ne comprends pas bien l'intérêt de cette classe... Pourquoi ne pas simplement étendre ArrayObject ?
Désolé, vraiment, je ne comprends pas l'utilité...

Commentaire de pyrrah le 08/01/2010 13:47:24

Hum, désolé moi non plus :/
Serait-il possible d'avoir des explications supplémentaires ? :)

Commentaire de Waredan le 12/01/2010 11:41:10

À vrai dire, je ne devais pas tout à fait être réveillé ..

$params = new ArrayObject(array(), ArrayObject::ARRAY_AS_PROPS);

$params['first_section']        = new ArrayObject(array(), ArrayObject::ARRAY_AS_PROPS);
$params['first_section']['one'] = 1;
$params['first_section']['two'] = 2;

$params->second_section       = new ArrayObject(array(), ArrayObject::ARRAY_AS_PROPS);
$params->second_section->path = '/path/to/something';
$params->second_section->url  = 'http://php.net/';

echo $params->first_section->one; // 1

echo $params['second_section']['path']; // '/path/to/something';

var_dump(isset($params->second_section->path)); // bool(true)

unset($params->second_section->path);

var_dump(isset($params->second_section->path)); // bool(false)

print_r($params);

//ArrayObject Object
//(
//    [storage:ArrayObject:private] => Array
//        (
//            [first_section] => ArrayObject Object
//                (
//                    [storage:ArrayObject:private] => Array
//                        (
//                            [one] => 1
//                            [two] => 2
//                        )
//                )
//
//            [second_section] => ArrayObject Object
//                (
//                    [storage:ArrayObject:private] => Array
//                        (
//                            [url] => http://php.net/
//                        )
//                )
//        )
//)

C'est la même chose, ça prends moins de place :$

Commentaire de neigedhiver le 12/01/2010 11:52:38

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...

Commentaire de Waredan le 12/01/2010 17:05:19

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.

Commentaire de neigedhiver le 12/01/2010 18:12:02

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 ^^

Commentaire de Waredan le 13/01/2010 10:00:50

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 ;)

Commentaire de neigedhiver le 13/01/2010 10:35:35

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 ;)

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

templates avec poo [ par lesnes ] bonjours je reprogramme totalement mon site en poo et je souhaiterai utiliser les templates mais l'on ne peut pas faire appel a une class exterieur a [POO] Une classe dans une classe [ par Mrreivax ] Bonsoir.Et bien voila. J'ai créé une classe de gestion des images.J'ai par la suité créé une autre classe de gestion de banières.Mais, cette dernière Class POO retourné le nom de l'objet [ par MeTh ] Bonjour,Comment retourné le nom de l'objet déclaré?exemple :$monobjet = new GridR();comment recuperé $monobjet dans ma class?Merci Include, class et array [ par Hades5k ] Bonjour! J'ai un petit problème à utiliser un array dans un fichier que j'inclus... voici un peu le code : &lt;?php $classNames = array(); include_onc Problem d'affichage de resultat de requete sous forme de tableau [ par jbcaiz ] explication : je fais un requete de recherche dans ma base, qui doit normalement me sortir plusieur résultat.je veux que ces résultat s'affiche dans u Serveur SMTP [ par Marion0904 ] Bonsoir, J'essai d'nvoyer des mails en utilisant la class phpmailer (disponible sur&nbsp; http://phpmailer.sourceforge.net/). J'incu la class php mail class,PDF,XLS et boucles..... [ par booth ] bonjour!j'ai un méga problème...je dois générer un PDF et une grillle excel toutes deux issues d'un moteur de recherche...pour le moteur de recherche Retouches sur un scripts [ par apz ] salut,ce script php, un guestbook, est le livre d'or que je cherchais.mais voila il se base sur les Class, que je ne connais pas desormais.alors je vo fatal error sur chargement de class [ par fabrice_pi ] salut à tous,j'utilise une classe PHP pour faire mes taleaux en html. depuis peu j'ai l'erreur suivante :Fatal error: Cannot instantiate non-existent probleme avec php photo modules [ par mellekristel ] Bonjour, je suis débutante en php. j'ai créer un site pour une artiste peintre, et j'ai utilisé et modifié le script "php photo module", Ce script est


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,031 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales