JeuWeb - Crée ton jeu par navigateur
[Résolu]variable statique : unique pour tous les connectés simultanés - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [Résolu]variable statique : unique pour tous les connectés simultanés (/showthread.php?tid=4634)



[Résolu]variable statique : unique pour tous les connectés simultanés - Ter Rowan - 10-03-2010

coucou

Lors d'une discussion, on m'a dit qu'un membre statique de classe était unique pour l'ensemble des connectés simultanément. Je soutenais le contraire mais vu l'insistance de mes collègues, bien plus pointus que moi (en java du moins) j'ai testé pour voir :

Code PHP :
<?php 
class testStatique
{
static
$a;
public
$b = 0;

function
__construct()
{
echo
'construction statique = '.$this->a.' variable = '.$this->b.'<br>';
$this->_st +=100;
$this->_var +=100;
echo
'construction terminée statique = '.$this->a.' variable = '.$this->b.'<br>';
sleep(10);
}

function
up()
{
$this->a +=100;
$this->b +=100;
echo
'méthode augmentation statique = '.$this->a.' variable = '.$this->b.'<br>';
}
}

$toto = new testStatique;
$toto->up();

je lance ce code sur deux navigateurs (un firefox et un internet explorer)
avec les 10 secondes d'attente je suis persuadé avoir le temps de lancer le deuxieme script avant la fin du premier...

et patatra les deux me donnent le même résultat :
Citation :construction statique = variable = 0
construction terminée statique = 100 variable = 100
méthode augmentation statique = 200 variable = 200

j'en conclue donc que j avais raison, un membre statique n'est statique que dans le thread où il est créé.

Mais peut être me trompe je ?

a votre avis ?


RE: variable statique : unique pour tous les connectés simultanés - jo_link_noir - 10-03-2010

Bonsoir,

C'est unique au processus courant. Mais vu qu'à l'appelle d'une page web un autre processus est créé le "unique pour l'ensemble des connectés simultanément" n'est pas valable.
C'est la même chose en java si on lance 2 fois le même programme.
Quand on utilise des threads ça passe car ils utilisent la même mémoire.
package javaapplication1;

public class Main extends Thread{
public static int a = 0;
public int b = 0;

public static void main(String[] args) {
try {
(new Main()).start();
Thread.sleep(5000);
(new Main()).start();
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
}

public void run()
{
a+=100;
b+=100;
System.out.println(a+"/"+b);
}
}

affiche :
100/100
200/100

mais si je lance 2 fois ce programme je pourrais voir
100/100
100/100
200/100
200/100

Voilà... rien d'autre à ajouter ><
Bonne nuit


RE: variable statique : unique pour tous les connectés simultanés - QuentinC - 10-03-2010

C'est logique puisque l'ensemble du code php est reparsé à chaque appel de page web.

Pour que ce soit possible, il faut utiliser un système de cache commun, p.ex. memcached, APC, ... ou alors stocker la donnée dans un fichier ou en base, avec la lenteur que ça implique.


RE: variable statique : unique pour tous les connectés simultanés - Ter Rowan - 10-03-2010

ah ben merci

je vais pouvoir faire le malin au bureau :p