Objet global dans Class PHP

Petit nouveau ! | 7 Messages

23 août 2009, 21:50

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 )

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

23 août 2009, 22:24

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.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Petit nouveau ! | 7 Messages

23 août 2009, 22:47

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.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

23 août 2009, 23:12

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"'
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Petit nouveau ! | 7 Messages

24 août 2009, 23:08

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 ;)

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

25 août 2009, 08:22

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.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer