IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Session et accesseurs


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé

    Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 118
    Par défaut Session et accesseurs
    Bonjour,

    Dans le but de m'initier à PHP, j'ai développer un script qui permet de jouer a une genre de MasterMind.

    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
     
     
    <?php 
    class MasterMind {
    	private $code;
    	private $tableauPropositions = array();
    	private $bienPlaces = array();
    	private $malPlaces = array();
    	private $nbTentatives;
     
    	public function __construct() { // constructeur qui genere mon code aleatoire
    		$chiffres = array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
    		shuffle($chiffres); // je melange mon tableau de 9 chiffres...
    		$this->code = array ($chiffres[0], $chiffres[1], $chiffres[2], $chiffres[3]); //...et je prends les 4 premieres cases	
    		$this->nbTentatives = 0; 
    	}
     
    	public function getCode($i) {
    		return $this->code[$i];
    	}
     
    	public function getTableauPropositions($i) {
    		return $this->tableauProposiitons[$i];
    	}
     
    	public function getBienPlaces($i) {
    		return $this->bienPlaces[$i];
    	}
     
    	public function getMalPlaces($i) {
    		return $this->malPlaces[$i];
    	}
     
    	public function getNbTentatives() {
    		return $this->nbTentatives;
    	}
     
    	public function setCode($i, $valeur) {
    		$this->code[$i] = $valeur;
    	}
     
    	public function setTableauPropositions($i, $valeur) {
    		$this->tableauPropositions[$i] = $valeur;
    	}
     
    	public function setBienPlaces($i, $valeur) {
    		$this->bienPlaces[$i] = $valeur;
    	}
     
    	public function setMalPlaces($i, $valeur) {
    		$this->malPlaces[$i] = $valeur;
    	}
     
    	public function setNbTentatives($valeur) {
    		$this->nbTentatives = $valeur;
    	}
     
    	public function test($prop) {
     
    		// je mets l'entier passé en paramètre dans un tableau
    		$propTableau[3] = $prop % 10;
    		$propTableau[2] = ($prop / 10) % 10;
    		$propTableau[1] = ($prop / 100) % 10;
    		$propTableau[0] = (int)($prop / 1000);
     
     
    		// je compare les deux tableaux $propTableau et $code
    		$this->bienPlaces[$this->nbTentatives] = 0;
    		$this->malPlaces[$this->nbTentatives] = 0;
    		for ($i=0 ; $i<4 ; $i++) {
    			if ($propTableau[$i] == $this->code[$i]) {
    				$this->bienPlaces[$this->nbTentatives]++;					
    			}
    			else if (in_array($propTableau[$i], $this->code)) {
    				$this->malPlaces[$this->nbTentatives]++;
    			}
    		}			
    	}
     
    	public function afficheTableauJeu() { 
    	?>
    		<table border="1">
    			<tr><td>Numero</td> <td>Propositions</td> <td>Bien placé(s)</td> <td>Mal placé(s)</td></tr>
     
    			<?php 
    			for ($i=1 ; $i <= $this->nbTentatives ; $i++) { 
    			?>
    				<tr><td><?php echo $i;?></td> 
    					<td> <?php echo $this->tableauPropositions[$i];?></td> 
    					<td> <?php echo $this->bienPlaces[$i];?></td> 
    					<td> <?php echo $this->malPlaces[$i];?></td></tr>
    			<?php
    			} 
    			?>
     
    			<tr><td></td>
    				<td><form action="mastermindSession2.php" method="post"> 
    					<input type="number" name="proposition" /></td> 
    				<td></td><td></td></tr>
    		</table>				
    		<input type="submit" value="Valider" />
    		</form>				
    	<?php
    	}
    }
     
    $lifetime=600;
    session_start();
    setcookie(session_name(),session_id(),time()+$lifetime);
    ?>
     
    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="utf-8" />
    		<link rel="stylesheet" href="" />
    		<title>Mastermind avec Session</title>
    	</head>
     
    	<body>		
    	<?php
    	if (!(isset($_POST['proposition']))) { // si j'arrive la premiere fois sur la page
    		$_SESSION['mastermind'] = new Mastermind(); // je genere une instance de Mastermind et son code dans la session
    		$_SESSION['mastermind']->afficheTableauJeu();		
     
    	} else if ((is_numeric($_POST['proposition'])) && (strlen(strval($_POST['proposition']))) == 4)	{ // cas normal
    		$_SESSION['mastermind']->setNbTentatives($_SESSION['mastermind']->getNbTentatives() + 1);
    		$_SESSION['mastermind']->setTableauPropositions($_SESSION['mastermind']->getNbTentatives(), $_POST['proposition']);
    		$_SESSION['mastermind']->test($_POST['proposition']);
    		$_SESSION['mastermind']->afficheTableauJeu();
     
    		if (($_SESSION['mastermind']->getBienPlaces($_SESSION['mastermind']->getNbTentatives())) == 4) { // cas de victoire
    			echo "VICTOIRE! FELICITATIONS!";
    		}	
    	}
     
    	else { // cas "saisie incorrecte"
    		$_SESSION['mastermind']->afficheTableauJeu();
    		echo "Veuillez seulement saisir 4 chiffres distincts, svp!";
    	}
    	?>		
     
    	</body>
    </html>
    Il fonctionne globalement, mais j'aimerai réaliser encore 2 choses:

    1) Que lorsque qu'on quitte une partie en cours et qu'on y revient dessus un peu plus tard, la partie n'est pas bougé.
    Je pensais que mettre "session_start();" après la déclaration de ma classe allait suffire mais apparemment non...
    J'utilise WampServer (je sais pas si c'est utilise de le préciser)

    2) Lors du développement, j'ai pas voulu m’embêter et j'ai mis les attributs de ma classe publics.
    Je veux rectifier le tir, mais j'ai pas forcement envie d'écrire tous les accesseurs et leurs appels...
    J'ai entendu parlé des accesseurs "magiques". J'ai les ai crée (voir commentaires dans mon code) mais ça n'a pas l'air de fonctionner non plus.

    J'espère que vous pourrez m'aider a résoudre ces problèmes.

    Merci!
    Bonne soirée.

  2. #2
    Membre Expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Par défaut
    Hello !

    Par défaut, une session est détruite à la fermeture du navigateur. Pour lui fixer une durée de vie fixe, tu peux aller voir de ce côté là : http://www.php.net/manual/fr/functio...kie-params.php

    Pour les accesseurs magiques, je ne les ai jamais utilisés mais quel est le message d'erreur que tu obtiens ? (Ca m'a pas l'air débile pourtant ce que tu as écris).

  3. #3
    Membre confirmé

    Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 118
    Par défaut
    J'y ai pensé aussi mais ça marche pas.
    Est ce que ça a pas un rapport avec le fait que je sois en local?

    Sur le code ci dessus, si j'enleve les commentaires sur mes accesseurs et que je mets tous mes attributs privés, j'ai 2 erreurs:
    Notice: Indirect modification of overloaded property MasterMind::$tableauPropositions has no effect in C:\Program Files\wamp\www\mastermindSession.php on line 110
    Notice: Undefined offset: 1 in C:\Program Files\wamp\www\mastermindSession.php on line 72

  4. #4
    Membre Expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Par défaut
    Ah oui en effet, premier commentaire de la doc pour cette fonction "session_set_cookie_params" : http://www.php.net/manual/fr/functio...ams.php#100657

    C'est assez explicite, voilà donc le code qui devrait marcher :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $lifetime=600;
    session_start();
    setcookie(session_name(),session_id(),time()+$lifetime);
    Pour les accesseurs ok du coup c'est logique, ton setter ne peut pas marcher sur les attributs de type tableau. Et honnêtement, je ne sais pas comment ils se comportent dans ce cas là, ni même si cela est possible de les utiliser.

  5. #5
    Membre confirmé

    Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 118
    Par défaut
    Et non, malheureusement toujours pas...

    Pour les accesseurs, tant pis, ça m'apprendra a les avoir mis public au début.

    En revanche, pour la session, c'est un peu plus embêtant, c'était un peu le but de mon exercice...
    Peut être en faisant tourner mon script sur un vrai serveur?

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Par défaut
    1- Évite d'utiliser les méthodes magiques dans la mesure du possible. Il est préférable que tout soit explicite afin d'éviter les malentendus plus tard. Tout bon IDE qui se respecte te permettra de créer des getters et des setters automatiquement.

    2. Si tu veux malgré tout utiliser des getters/setters pour tes tableaux, la bonne méthode est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public function __get($attribut) {
            $properties = get_object_vars($this);
     
            if(array_key_exists($attribut, $properties)){
                return $properties[$attribut];
            } 
     
            else {
                //etc...
            }
    }
    3.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $_SESSION['mastermind'] = new Mastermind(); // je genere une instance de Mastermind et son code dans la session
    $_SESSION['mastermind']->afficheTableauJeu();
    ARGH :-( Évite de manipuler directement une superglobale comme ça. C'est illisible, c'est dangereux (les superglobales peuvent être utilisées par d'autres parties de ton application, voire dans le cas des sessions par d'autres pages et autres "sessions" ultérieures et tu risques d'avoir des effets imprévisibles en faisant ça. Les sessions sont destinées à faire passer un état d'une page à l'autre, par pour servir de conteneur à objet. Je ne comprends même pas que PHP autorise ça :-(

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Servlets - JSP] Problème de session
    Par the java lover dans le forum Servlets/JSP
    Réponses: 8
    Dernier message: 28/11/2011, 10h54
  2. [JSP][session] perte de session et sendRedirect
    Par blaz dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 30/03/2007, 10h32
  3. Réponses: 12
    Dernier message: 24/09/2003, 16h26
  4. [XMLRAD] session
    Par jml dans le forum XMLRAD
    Réponses: 4
    Dernier message: 17/12/2002, 10h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo