Techno-magis

Variables de classe indexées

2014年3月14日(金曜日)

À 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
 

カテゴリ:
Zéflingによって、 2014/03/14 09:37:45
144回を読んだ。0件のコメントが投稿されています。

コメントなし

下のフォームにメッセージを書き込んで下さい。

コメントを書き込む