Bonjour,

J'ai créée une classe singleton, qui me semble avoir un problème: à chaque fois que je transmet le formulaire l'instance est remise à zéro.

Au lieu de récupérer une instance créée une fois pour toute, la classe singleton agit comme une classe qui ne l'est pas...
ci-dessous mon code:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
 
<?php
 
	// nom de fichier : bug_sgl.php
 
 
	// recuperation valeur
 
	Sgl::Instance()->Load();
 
	echo "<html><head></head><body>";
	echo "<br>Valeur de retour:(".Sgl::Instance()->mValeur.")";
 
	echo "<form name=test action=bug_sgl.php  method='get'>";
	echo "<input type ='submit' value='envoi' name='toto' />";
	echo "<input type ='hidden' value='retour' name='lavaleur' />";
	echo "</form>";
	echo "</body></html>";
 
 
	class Sgl {
 
		static protected $mInstance;
		static public $mCompteur;
 
		public $mValeur;
 
		protected function __construct( ) {	}
		protected function __destruct( ) { echo"<br> bye bye";	}
 
		public function Instance() {
			self::$mCompteur++;
			if( is_null(self::$mInstance) ){
				self::$mInstance = new Sgl();
				echo "<br>Sgl:::Creation de l'instance n°(".self::$mCompteur.")";
			} else {
				echo "<br>Sgl::Récupération de l'instance n°(".self::$mCompteur.")";
			}
				return self::$mInstance;
		}
 
		public function Load() {
			$this->mValeur =   isset($_GET['lavaleur'])  ?  $_GET['lavaleur'] : null ;
		}
 
	}
?>

l'affichage en sortie donne :

Sgl:::Creation de l'instance n°(1)
Sgl::Récupération de l'instance n°(1)
Valeur de retourretour)

Warning: Call to protected Sgl::__destruct() from context '' during shutdown ignored in Unknown on line 0
- le compteur initialisé dans la classe sert de marqueur, il n'est incrémenté qu'une fois. Le problème c'est qu'il ne devrait pas l'être à envoi de formulaire.


Mes questions :
- Comment faire pour avoir un comportement du singleton habituel (l'instance est créée une seule fois) ?
- Comment éviter l'appel au destructeur ?

Merci de vos réponses