Explication : instance unique (singleton)

Résolu/Fermé
nico_73 Messages postés 161 Date d'inscription mercredi 10 juin 2009 Statut Membre Dernière intervention 28 mai 2010 - 2 juil. 2009 à 10:29
Dalida Messages postés 6728 Date d'inscription mardi 14 mai 2002 Statut Contributeur Dernière intervention 11 janvier 2016 - 3 juil. 2009 à 12:21
Bonjour à tous,

La méthode suivante qui créer une instance unique :

	public function config ( $pathIni = NULL )
	{
		if ( is_null ( self::$_instance ) )
		{
			self::$_instance = new self ( $pathIni );
		}
		
		return self::$_instance;
	}


Fonctionne bien ! Mais dans mon logs, elle génère une erreur lors de son fonctionnement de type :

Non-static method Core_Configuration_Config::config() should not be called statically, assuming $this from incompatible context, CHEMIN


J'ai donc ajouter "static" apres "public" il n'y a plus d'erreur. Seriez-vous m'expliquer pourquoi ?

Merci d'avance.

5 réponses

Dalida Messages postés 6728 Date d'inscription mardi 14 mai 2002 Statut Contributeur Dernière intervention 11 janvier 2016 920
2 juil. 2009 à 18:28
salut,

le but de singleton est de renvoyer une instance d'objet avec comme particularité de ne pas créer une nouvelle instance à chaque fois mais seulement au premier appel, ensuite il renvoie l'instance déjà créée.
(jusque là, ok).

pour ça tu n'instancies pas directement ta classe mais tu appelles une méthode qui te renvoie l'instance :
// tu ne fais pas 
$instance = new MaClasse();
// mais 
$instance = MaClasse::get_instance();

pour pouvoir exécuter la méthode (config() dans ton cas), il faut la déclarer "static" car ainsi elle peut être appelée sans que la classe soit instanciée ("new MaClasse()").
c'est aussi pour ça que dans la méthode tu utilises "self" et non pas "$this".

+ https://www.php.net/manual/fr/language.oop5.static.php
0
nico_73 Messages postés 161 Date d'inscription mercredi 10 juin 2009 Statut Membre Dernière intervention 28 mai 2010
3 juil. 2009 à 08:56
Merci Dalida, a croire que tu m'aides souvent sur ce sujet, ça fait plaisir ;)

Cela voudrait-il dire que je peux créer mon instance pour créer ma singleton en static à un endroit, puis, très loin dans le programme (par exemple dans une autre classe), je peux appeler une méthode (qui est en static elle aussi) sans refaire appel à la première instance ?

Exemple :


Ma_Class::config ( );

Beaucoup de code de prog ....

Ma_Class::Autre_Mehtod_Qui_Charge_Des_Complements_De_Config ( )



Est ce que c'est bon ?
0
Dalida Messages postés 6728 Date d'inscription mardi 14 mai 2002 Statut Contributeur Dernière intervention 11 janvier 2016 920
3 juil. 2009 à 09:30
salut,

je peux appeler une méthode (qui est en static elle aussi) sans refaire appel à la première instance ?
je suis pas sûr de comprendre exactement.

dans ton cas :
$singleton = Ma_Class::config( ); /* là tu instancies ton objet "singleton" c'est à dire le seul objet qui peut être instancié à partir de cette classe */

Ma_Class::Autre_Mehtod_Qui_Charge_Des_Complements_De_Config( ); /* là tu peux créer des méthodes qui modifient ton singleton */

dans ta deuxième méthode tu fais quelque chose du genre :
static function :Autre_Mehtod_Qui_Charge_Des_Complements_De_Config( )
{
    self::$_instance ++; /* tu agis sur le singleton, ici une simple incrémentaion */
}

et plus tard tu as à nouveau besoin de ton singleton :
$singleton_ailleurs_et_plus_tard = Ma_Class::config( );

là tu retrouves ton premier singleton mais qui a été incrémenté de 1.
0
nico_73 Messages postés 161 Date d'inscription mercredi 10 juin 2009 Statut Membre Dernière intervention 28 mai 2010
3 juil. 2009 à 10:27
je peux appeler une méthode (qui est en static elle aussi) sans refaire appel à la première instance ?
je suis pas sûr de comprendre exactement.


voila un exemple
class _1
{
public function __construct ( )
{
$this->conf = Ma_Class::config ( );
}
}

class _2
{
public function __construct ( )
{
$test = Ma_Class::config ( );
$test->Autre_Mehtod_Qui_Charge_Des_Complements_De_Config ( ); /* dans le cas ou la methode n'est pas static */
}
}

new _1;
new _2;


je considère dans class _1 que j'ai besoin de la config
actuellement si je dois appel mon singleton de la config je fais comme dans class _2.

donc j'appel 2 fois ce code : Ma_Class::config ( );

est-ce que la fais de mettre en static :Autre_Mehtod_Qui_Charge_Des_Complements_De_Config ( ) permet de faire ceci ?

class _1
{
public function __construct ( )
{
$this->conf = Ma_Class::config ( );
}
}

class _2
{
public function __construct ( )
{
Ma_Class::Autre_Mehtod_Qui_Charge_Des_Complements_De_Config ( ); /* dans le cas ou la methode est static */
}
}

new _1;
new _2;


Ce qui permet de ne plus appeler 2 fois : Ma_Class::config ( );

Parce que j'imagine que ça prends des recouses d'appeler trop souvent le même objet.

Est ce que je suis un peux plus claire ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
nico_73 Messages postés 161 Date d'inscription mercredi 10 juin 2009 Statut Membre Dernière intervention 28 mai 2010
3 juil. 2009 à 12:00
Jusqu'à maintenant je n'avais pas trouvé le cas typique qui me permettais de tester ce que je voulais faire plus haut, mais je viens à l'instant de mettre en application mon exemple précédent et ça fonction.

Merci pour ton aide. ;)
0
Dalida Messages postés 6728 Date d'inscription mardi 14 mai 2002 Statut Contributeur Dernière intervention 11 janvier 2016 920
3 juil. 2009 à 12:21
je ne suis plus trop mais si ça fonctionne c'est parfait !

bon courage pour la suite !
0