Utilité... et risques : utilisation d'un pattern Singleton ?

Mammouth du PHP | 19672 Messages

30 juil. 2006, 11:27

Salut tout le monde.
ma question s'adresse avant tout aux gourous de la POO en PHP5. Je m'interroge sur les risques possibles dans l'utilisation d'un pattern Singleton. J'en ai compris l'intérêt dans la mesure où ça évite de multiplier inutilement les instances d'un objet, ça, c'est très bien.

Mais je me demande comment c'est géré au niveau du serveur si plusieurs internautes se connectent simultanément : mettons que mon instance de classe d'accès aux données soit construite selon ce pattern : aurais-je une instance distincte par internaute ou une instance unique pour tous ceux qui sont connectés ? Cette dernière option pourrait se révéler désastreuse puisque les propriétés de l'objet doivent forcément varier d'un internaute à l'autre. :afraid:

Accessoirement, une suggestion sur la manière de tester ça serait bienvenue ;)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 983 Messages

30 juil. 2006, 11:36

Salut cyrano,

Chaque utilisateur aura son propre contexte d'exécution et heureusement d'ailleurs! Le seul moyen de partager des informations entre différents utilisateurs est soit d'utiliser de la mémoire partagée ou bien de créer une session partagée (tu fixes l'identifiant de session de manière à pouvoir la récupérer pour n'importe quel utilisateur).

edit: pour tester, tu peux utiliser un compteur qui s'incrémente à chaque appel d'une méthode :
/**
 * Bd <<singleton>>
 */
class Bd
{
	private static $_instance = null;
	
	private $_count;
	
	private function __construct()
	{
		$this->_count=0;
	}
	
	public static function getInstance()
	{
		if(is_null(self::$_instance))
		{
			self::$_instance = new self();
		}		
		return self::$_instance;
	}
	
	public function getCount()
	{
		return ++$this->_count;
	}
}


session_start();

if(!isset($_SESSION['bd']))
{
	$_SESSION['bd'] = Bd::getInstance();
}

echo "Compteur = {$_SESSION['bd']->getCount()}";

Mammouth du PHP | 19672 Messages

30 juil. 2006, 11:51

J'avais bien eu l'idée d'assortir la technique du singleton d'un paramètre sous la forme d'un identifiant de session pour m'assurer de façon non équivoque que chaque processus est indépendant pour chaque internaute. Mais avant d'ajouter cet élément "de sécurité" et de ce fait alourdir un peu mon code, je me suis quand même demandé comment c'était géré coté serveur et comment le vérifier.

Comme développeur, je suis d'un naturel paresseux pour ne pas dire d'une fainéantise crasse et si je peux n'écrire qu'un ligne de code au lieu de deux, je sombre corps et bien dans la version courte... pour autant que ça ne risque pas de nuire à la sécurité et à l'efficacité de mon application, ça va sans dire ;)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe: