À la base, j'avais besoin d'une information que je puisse appeler soit par le nom de variable soit par une position dans un index. Pour faire simple, l'information était dupliquée deux fois... Le problème, c'est qu'en cas de modification, c'est assez chiant à corriger.
J'ai fini par simplifier ma tâche en réduisant le tout à un seul tableau indexé avec une table de correspondance. Avec l'aide des méthodes magiques __get()
et __set
, il est possible de faire ça assez simplement. Pour que ça soit utilisable facilement ailleurs, je suis partis sur des appels static
et non self
lors de l'appel à liste de correspondance. Le seul inconvénient est que ça augmente le traitement dû à la recherche de la correspondance.
Je commence donc par faire un objet générique pour cela :
class Correspondance {
public static $correspondance;
public $tab = array();
public function __get ($name) {
if (!empty(static::$correspondance) &&
($key = array_search($name, static::$correspondance)) !== false &&
array_key_exists($key, $this->tab)) {
return $this->tab[$key] ;
}
return null;
}
public function __set ($name, $val) {
if (!empty(static::$correspondance) &&
($key = array_search($name, static::$correspondance)) !== false) {
$this->tab[$key] = $val;
}
}
public function __isset ($name) {
return !empty(static::$correspondance) &&
($key = array_search($name, static::$correspondance)) !== false &&
array_key_exists($key, $this->tab);
}
public function __unset ($name) {
if (!empty(static::$correspondance) &&
($key = array_search($name, static::$correspondance)) !== false &&
array_key_exists($key, $this->tab){
unset($this->tab[$key]);
}
}
Dans une classe fille, je redéfini mon tableau de correspondance :
class MonObjet extends Correspondance {
public static $correspondance = array(
1 => 'var1',
2 => 'var2',
3 => 'var3'
);
}
Maintenant, je peux utiliser mes variables de deux façons :
$object = new MonObjet ();
$object->var1 = "test";
echo $object->tab[1]; // affiche : test