Explication : instance unique (singleton)
Résolu
nico_73
Messages postés
180
Statut
Membre
-
Dalida Messages postés 7114 Date d'inscription Statut Contributeur Dernière intervention -
Dalida Messages postés 7114 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour à tous,
La méthode suivante qui créer une instance unique :
Fonctionne bien ! Mais dans mon logs, elle génère une erreur lors de son fonctionnement de type :
J'ai donc ajouter "static" apres "public" il n'y a plus d'erreur. Seriez-vous m'expliquer pourquoi ?
Merci d'avance.
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.
A voir également:
- Explication : instance unique (singleton)
- Paris multiple 2/6 explication - Forum Excel
- Chambre 1408 explication fin ✓ - Forum Mozilla Firefox
- Black butler saison 2 explication ✓ - Forum Cinéma / Télé
- Foyer netflix explication - Accueil - Guide streaming
- Paris Sportifs Combinés - Forum Loisirs / Divertissements
5 réponses
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 :
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
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
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 :
Est ce que c'est bon ?
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 ?
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 :
dans ta deuxième méthode tu fais quelque chose du genre :
et plus tard tu as à nouveau besoin de ton singleton :
là tu retrouves ton premier singleton mais qui a été incrémenté de 1.
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.
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
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 ?
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 ?
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 ?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question