Archives mensuelles : mars 2009

Un modeste conteneur de paramètres en PHP5

Voici un code que j’utilise depuis un moment et que je viens d’introduire récemment dans un projet.

L’idée est de proposer à certaine classe de mon projet un conteneur de paramètre flexible et facilement utilisable par les développeurs.

parameters[strtolower($key)] = $value;
  }

  /**
   * teste l'existence d'un parametre
   * @param $key string
   * @return boolean
   */
  public function hasParameter($key)
  {
    if (array_key_exists($key, $this->getParameters()))
    {
      return true;
    }
    else
    {
      return false;
    }
  }

  /**
   * recuperation d'un parametre
   * @param $key string
   * @param $default string
   * @return mixed
   */
  public function getParameter($key, $default = null)
  {
    if ($this->hasParameter($key))
    {
      return $this->parameters[$key];
    }
    elseif (!is_null($default))
    {
      return $default;
    }
    else
    {
      return null;
    }
  }


  /**
   * gere automatique les get et les set
   */
  public function __call($name, $arguments)
  {
    $key = strtolower(substr($name,3));
    $arg = isset($arguments[0]) ? $arguments[0] : null;
    if (substr($name,0,3) === 'has')
    {
      return $this->hasParameter($key, $arg);
    }
    
    if (substr($name,0,3) === 'get')
    {
      return $this->getParameter($key, $arg);
    }

    if (substr($name,0,3) === 'set')
    {
      if (!$arg)
      {
        throw new myException(get_class($this).' un second argument est nécessaire pour une méthode set');
      }
      return $this->setParameter($key,$arg);
    }

    throw new myException('notre __call ne gère que les get ou les set ! méthode indéfinie : '.$name);
  }
}

La méthode __call, ainsi utilisée, permet d’accéder facilement au tableau de paramètres.

Par exemple, dans un script php, on pourra simplement écrire des choses de ce genre :

$param_holder = new ParameterHolder();
$param_holder->setUnParametre('coucou');
$var = $param_holder->getUnParametre();
// ...

Vos classes peuvent également étendre ParametreHolder ou en déclarer un lors de l’appel au constructeur et « attraper » les get* et les set* en utilisant __call. Il est enfin possible de surcharger certains getter ou setter pour faire des traitements spécifiques tout en gardant un comportement générique via __call pour les autres. Voici un petit exemple :

class myClass
{
  private $parameter_holder = null;
  public function __construct()
  {
    $this->parameter_holder = new ParameterHolder();
  }

  public function getRaoul()
  {
   throw new myException('tu tu tut, faut pas fâcher Raoul !');
  }

  public function __call($name, $arguments)
  {
    $this->parameter_holder->__call($name, $arguments);
  }
  
}

En espérant que cela vous soit utile.