Objet global dans Class PHP

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Objet global dans Class PHP

Re: Objet global dans Class PHP

par zeus » 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.

Re: Objet global dans Class PHP

par gtenthorey » 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 ;)

Re: Objet global dans Class PHP

par zeus » 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"'

Re: Objet global dans Class PHP

par gtenthorey » 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.

Re: Objet global dans Class PHP

par zeus » 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.

Objet global dans Class PHP

par gtenthorey » 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 )