Techno-magis

Variables de classe indexées

Friday 14th March 2014

À 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 :

CODE:

 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 :

CODE:

 
class MonObjet extends Correspondance {
 
	public static $correspondance = array(
		 1 => 'var1',
		 2 => 'var2',
		 3 => 'var3'
	);
 
}
 

Maintenant, je peux utiliser mes variables de deux façons :

CODE:

 
$object = new MonObjet ();
 
$object->var1 = "test";
 
echo $object->tab[1]; // affiche : test
 

Categories:
By Zéfling, the 14/03/2014 at 09:37:45
The ticket was read 131 times, with 0 comment posted.

No comment

Write your below.

Write a commentary