Rechercher : dans
Par :

Explication : instance unique (singleton)

Dernière réponse le 3 jui 2009 à 12:21:36 nico_73, le 2 jui 2009 à 10:29:37 
 Signaler ce message aux modérateurs

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.
Configuration: Windows Vista
Firefox 3.0.11

Meilleures réponses pour « Explication : instance unique (singleton) » dans :
Multi instance sous Virtual DJ (Plus de 2 platines) VoirComment puis-je jouer de la musique avec plus de 2 platines virtuelles sous Virtual DJ ? Ici, vous allez voir comment mixer avec 3 platines ou plus sur un seul PC. En premier temps, c'est pas nouveau, il faut l'avoir ce logiciel. Il est...
Oracle - Composants de l’architecture Oracle VoirUn serveur Oracle est un système qui permet de gérer les bases de données et qui offre un moyen de gestion des informations ouvert, complet et intégré. Un serveur Oracle est constitué d’une instance et d’une base de données. Instance...
Ouvrir tous les dossiers dans une fenêtre unique VoirDans les Options des Dossiers, Windows propose deux choix pour ouvrir un dossier : Ouvrir tous les dossiers dans une fenêtre unique Ouvrir chaque dossier dans une fenêtre séparée Nous allons voir ce qui les différencie avec un...
Java - Les objets VoirLa création d'objets Un objet est une instance de classe, la création d'objets s'appelle donc l'instanciation. Cette instanciation se fait grâce à l'opérateur new suivi du nom de la classe à instancier et de parenthèses contenant les paramètres...
Les objets en langage C++ VoirLa création d'objets En C++, il existe deux façons de créer des objets, c'est-à-dire d'instancier une classe : de façon statique de façon dynamique La création statique La création statique d'objets consiste à créer un objet en lui affectant un...
Classe et instance d'objet VoirLa notion de classe On appelle classe la structure d'un objet, c'est-à-dire la déclaration de l'ensemble des entités qui composeront un objet. Un objet est donc « issu » d'une classe, c'est le produit qui sort d'un moule. En réalité on dit qu'un...

1

Dalida, le 2 jui 2009 à 18:28:00

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".

+ http://www.php.net/manual/fr/language.oop5.static.php
[ Mathieu ]
Il y a sûrement des pandas pour ne dépendre de rien

Répondre à Dalida

2

nico_73, le 3 jui 2009 à 08:56:41

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 ?

Répondre à nico_73

3

Dalida, le 3 jui 2009 à 09:30:34

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.
[ Mathieu ]
Il y a sûrement des pandas pour ne dépendre de rien

Répondre à Dalida

4

nico_73, le 3 jui 2009 à 10:27: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 ?

Répondre à nico_73

5

nico_73, le 3 jui 2009 à 12:00:34

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

Répondre à nico_73

6

 Dalida, le 3 jui 2009 à 12:21:36

Je ne suis plus trop mais si ça fonctionne c'est parfait !

bon courage pour la suite !
[ Mathieu ]
Il y a sûrement des pandas pour ne dépendre de rien

Répondre à Dalida