Probleme modification attribut static

Résolu/Fermé
L1RW56 - 18 févr. 2014 à 16:00
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 - 19 févr. 2014 à 09:09
Bonjour,

J'ai un problème lors de la modification d'un attribut static d'une classe PHP.

Je cherche à pouvoir modifier un salaire (variable static d'une classe) à partir d'un formulaire HTML et, plus particulièrement, conserver la valeur de cet attribut.

J'ai donc une class appelée InternalTeacher avec un attribut static et deux fonctions static me permettant d'afficher ou de modifier cet attribut.

InternalTeacher.class.php :

<?php
class InternalTeacher
{
	private static $_Salaire;
	
	public static function Salaire()
	{
		return self::$_Salaire;
	}
	
	public static function ModifierSalaire($salaire)
	{
		self::$_Salaire = $salaire;
	}
}
?>


Puis une page contenant un formulaire.

professeur.inc.php :

<div id="salaire">
<?php

/* --------- Récupération Données Formulaire --------- */

if(isset($_POST['new_salaire']))
{
	if(!empty($_POST['new_salaire']))
	{
		$new_salaire = $_POST['new_salaire'];
	}
	else echo'<p align="center">Une erreur est survenu lors de la récupération du nouveau salaire</p>';
}

/* --------- Modification Salaire --------- */

if(isset($new_salaire))
{
	InternalTeacher::ModifierSalaire($new_salaire);
	echo '<p align="center">Salaire modifié'.InternalTeacher::Salaire().'</p>';
}

?>

<!-- --------- Formulaire Modification salaire --------- -->

<fieldset>
<legend><strong>Modifier Salaire Professeur Interne</strong></legend>

<form method="post" action="?page=professeur">
<p>Salaire actuel : <?php echo InternalTeacher::Salaire();?> €</p>
<p>
	<label for="new_salaire">Nouveau Salaire :</label>
	<input type="number" id="new_salaire" name="new_salaire" min="0" step="1" required/>
</p>
<p>
	<input type="submit" value="Enregistrer">
</p>
</form>

</fieldset>
</div>



Un script PHP qui se charge d'inclure les classes nécessaires ainsi que les scripts PHP envoyés à partir de variable $_GET

index.php :

<?php 
function chargerClasse($classe)
{
  require '/class/'. $classe . '.class.php';
}
spl_autoload_register('chargerClasse'); 

echo '<a href="?page=professeur">Professeur</a>  <a href="?page=test">Test</a>';

if (isset($_GET['page']))
{
	$page = $_GET['page'];
	
	if (!empty($page))
	{
		if (file_exists("pages.inc/".$page.".inc.php"))
		{
			include("pages.inc/".$page.".inc.php");
		}
		else include("pages.inc/professeur.inc.php");
	}
}
else include("pages.inc/professeur.inc.php");
			
?>


Et enfin, un fichier test.inc.php contenant juste
<h1>TEST</h1>


Pour faire un test j'effectue :
- je lance le fichier index.php
- je modifie le salaire dans le formulaire
- la modification s'effectue
- je clique sur le lien "Test"
- je clique sur le lien "Professeur"
- la valeur de l'attribut static "salaire" est revenu par defaut

Je n'arrive donc pas à garder la valeur de l'attribut static.

Si quelqu'un à le courage de regarder tout ça merci beaucoup!
A voir également:

5 réponses

Utilisateur anonyme
18 févr. 2014 à 16:28
Bonjour

J'ai l'impression que tu confonds l'attribut "static" avec la notion de variable de session.

Quand tu as modifié une variable, fût-elle "static", et que tu cliques sur un lien, tu appelles un nouvelle page, donc tu démarres un nouveau script. Il démarre à partir de 0, avec ses propres variables et éventuellement certaines variables créées par le système comme $_POST ou $_GET ou $_SESSION. Mais la variable $salaire de la classe que tu as définie est recréée et n'a aucun 'souvenir' de ce qui s'est passé dans la page précédente.
Pour mémoriser une variable et la transmettre d'une page à l'autre, il faut utiliser les sessions.
Tu mets
session_start();
au début de chacune de tes bages et tu utilises le tableau superglobal $_SESSION pour enregistrer ce que tu veux dedans et le retrouver plus tard.
0
Merci pour ta réponse le pére.

En faite, lorsque je clique sur un lien, je n'ouvre pas vraiment une nouvelle page.
J'envoi juste une variable de type $_GET à mon script index.php qui se charge d'inclure le fichier correspondant à la variable $_GET.
Ce script inclut aussi les classes nécessaires.
Du coup, en faisant cela, est-ce que le script index.php sera rechargé à chaque fois et donc recharge à chaque fois les classes?

Si c'est le cas, effectivement je n'ai pas d'autre choix que d'utiliser une variable de session.
Ou alors, existe-il un moyen de changer de page en conservant "l'état" d'une classe?
0
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 525
18 févr. 2014 à 16:57
Salut,

En effet chaque requête recharge à chaque fois toutes tes classes et correspond à une nouvelle exécution de ton script. PHP étant un langage stateless, tu ne peux pas conserver d'état entre deux requêtes.

La solution est donc bien d'utiliser les sessions php.

Bonne journée
0
Utilisateur anonyme
18 févr. 2014 à 17:19
J'envoi juste une variable de type $_GET à mon script index.php
Tu rouvres peut-être la même page, mais ça ne change rien : le script précédent est terminé depuis belle lurette et c'est un nouveau script qui commence, peu importe que ce soit le même code ou non.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Merci pour ta réponse Pitet.

Je comprend mieux maintenant.

J'aurai une dernière question sans vouloir abuser.
Il n'est pas possible de modifier un attribut static par un utilisateur puisque il faut un formulaire HTML et que ce dernier va, dans tous les cas, recharger la page?
Si c'est le cas, n'existe-t-il pas une fonction PHP permettant de sauvegarder l'état d'une classe dans une session? (un peu comme serialize() pour les instances)

Si je n'ai pas de réponse, ce n'est pas grave, c'est juste par curiosité.

Encore merci à vous pour vos indications

Bonne journée
0
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 525
Modifié par Pitet le 19/02/2014 à 09:17
Tu peux tout a fait sérialiser une classe pour ensuite l'enregistrer en session :
https://www.php.net/manual/fr/language.oop5.serialization.php

Attention les attributs statiques d'un objet ne sont pas sérialisés.

Edit : je viens de voir que ta classe est tout en static (attribut et méthode). Tu perds donc les avantages du concept objet puisque toutes tes instances de la classe InternalTeacher partage le même salaire.
0