Page 1 sur 1

Objet global dans Class PHP

Posté : 23 août 2009, 21:50
par gtenthorey
Hello à tous,

J'aimerais avoir votre confirmation sur le point suivant :

J'ai un objet $o_MonObjet qui est utilisé tout au long mon site.
J'ai une class qui doit pouvoir modifier les propriétés de cet objet.

Donc je peux faire ceci dans la méthode de ma class
Global $o_MonObjet et ensuite je peux y accléder (ça fonctionne tip-top).

Mais si j'ai 50 méthodes je dois écrire 50 fois Global $o_MonObjet (une fois dans chaque méthode)

En fait je n'ai pas d'autres choix ? Il n'est pas possible de passer Global $o_MonObjet dans le constructeur de la class et d'y accéder ensuite par $this->o_MonObjet car il ne s'agit plus de l'objet original je suppose.

Merci de me confirmer si c'est bien le cas ( et si vous m'avez compris :D )

Re: Objet global dans Class PHP

Posté : 23 août 2009, 22:24
par zeus
Bonjour,

La solution de passer par des globales est déconseillée. En plus d'être potentiellement dangereuse pour la sécurité de ton site, ce n'est pas propre et pérenne dans un bon code source.
Il existe une solution pour ton soucis : le singleton. Je t'invite d'ailleurs à consulter ce sujet qui est très proche de ta question.

Re: Objet global dans Class PHP

Posté : 23 août 2009, 22:47
par gtenthorey
Merci, en fait j'utilise Smarty et je désire utiliser toujours le même objet de Template une fois crée.
Donc je m'amuse pas à modifier mes variables de manière globales mais cette classe modifie uniquement ce seul objet.

Re: Objet global dans Class PHP

Posté : 23 août 2009, 23:12
par zeus
Le principe du singleton est que tu récupère à chaque fois la même instance de l'objet.

La première fois que tu l'appelles, l'objet est chargé et stocké dans un attribut statique.
Toute les autres fois que tu fais appel au singleton, l'objet chargé la 1ère fois est retourné.

Voici un exemple qui pourrait te convaincre :
<?php

class Foobar
{
	/**
	 * Variable statique permettant de porter l'instance unique
	 */
	static protected $instance;
	
	/**
	 * Le nom de l'instance
	 */
	protected $name = '';
	
	/**
	 * Mutateur du nom de l'instance
	 */
	public function setName($name)
	{
		$this->name = $name;
	}
	
	/**
	 * Permet d'afficher le nom de l'instance
	 */
	public function displayName()
	{
		return sprintf('Le nom de l\'instance est "%s"', $this->name);
	}
	
	/**
	 * Singleton de la classe
	 */
	public function getInstance()
	{
		if( !isset(self::$instance) )
			self::$instance = new Foobar();
			
		return self::$instance;
	}
}

$o_a = Foobar::getInstance();
$o_a->setName('instance A');
echo $o_a->displayName(); // Affiche 'Le nom de l'instance est "instance a"'

$o_b = Foobar::getInstance();
echo $o_b->displayName(); // Affiche 'Le nom de l'instance est "instance a"'

Re: Objet global dans Class PHP

Posté : 24 août 2009, 23:08
par gtenthorey
Hello,

Effectivement je vais me tourner vers le singleton :)

J'ai fait un petit test avec ceci

Code : Tout sélectionner

$smarty = Smarty::getInstance();
suite à l'ajout de ceci dans ma classe Smarty

Code : Tout sélectionner

public static function getInstance() { if (!isset(self::$instance)) { self::$instance = new Smarty(); } return self::$instance; }
Tout me semble OK merci pour votre aide sympa ;)

Re: Objet global dans Class PHP

Posté : 25 août 2009, 08:22
par zeus
Modération :
Si ta question est résolue, pense à l'indiquer pour que les futures personnes qui voudront consulter ce sujet sachent qu'il contient une solution.
Tu peux réaliser cette opération toi-même en cliquant sur le bouton Image en haut à droite de la réponse qui te semble la plus pertinente.