Page 1 sur 2

Problème de Session POO

Posté : 08 nov. 2012, 14:39
par miiidooo19
Bonjour,

voila je début en POO

je voulais savoir si on instance un objet ex $client= new User(); dans un fichier index.php est ce que qu'on on passe a un autre fichier on perd notre instance $client ?

parce que moi quand je suis sur index.php j'ai un formulaire d'identification quand j'identifié, je suis tjr sur le fichier index mais quand je click sur un lien pour changer la page je perd mon $client comment régler ça ?


merci d'avance

Re: Problème de Session POO

Posté : 08 nov. 2012, 19:45
par xTG
Ton problème ne vient pas de la POO mais de l'utilisation des sessions. :)
Si tu ne mets rien en session il est normal de ne rien retrouver après un changement de page.
Car variable de type int ou bien variable de type MonObjet c'est le même fonctionnement.

Re: Problème de Session POO

Posté : 08 nov. 2012, 19:55
par miiidooo19
je pense que ça vien pas de session parce que quand je change la page et je fait un echo $_SESSION['name'] par exemple il est tjr open et même je ferme la page sans déconnexion et je relance la page et la session est encore open

Re: Problème de Session POO

Posté : 08 nov. 2012, 21:21
par xTG
Et ta variable $client... Elle est dans une variable de session ? Car là rien à voir avec la variable name.

Re: Problème de Session POO

Posté : 08 nov. 2012, 23:13
par miiidooo19
ah il faut stocker l'instance de l'objet user dans session ? :shock: je savais pas

donc si j'ai bien compris il faut faire un truc de genre
$client = new User();
$_SESSION['client'] = $client;


et pour Access aux méthodes au attributs dans n'importe quel fichier tant que la session est open il suffit de faire
$client = $_SESSION['client']; // inverse de ce qu'on a fait avant

$client->attribut1;
$client->method1;
//...



c'est bien ça ?

Re: Problème de Session POO

Posté : 09 nov. 2012, 00:32
par AB
Oui, mais n'oublie pas de déclarer session_start() avant l'utilisation des variables de session.

Re: Problème de Session POO

Posté : 09 nov. 2012, 00:37
par miiidooo19
J'ai essayé mais ça marche pas voici ce que j'ai fait

index.php
$_SESSION['Auth']= array(
'User'=>$User, 
'id'=>$utilisateur[0]["id"], 
'mail'=> $User->mail,
'password'=> $_POST['password'] 
);

header('location:profile.php');
profil.php
session_start();
	require "core/core.php";
	require "core/auth.php";

	if(Auth::islog()){
		echo ' yesss<br />';
	}
	else{
		header('location:index.php');
	}
	echo $_SESSION['Auth']['mail'];
	$User = $_SESSION['Auth']['User'];
	$User->test();
résultat

yesss
[email protected]
Fatal error: main() [<a href='function.main'>function.main</a>]: The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition "User" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide a __autoload() function to load the class definition in C:\Program Files (x86)\EasyPHP-5.3.9\www\PPE-POO\profile.php on line 14

d'après les résultats on vois vien que la session est tjr ouverte vu qu'il m'affiche $_SESSION['Auth']['mail'];

la ligne d'erreur 14 fichier profile.php c'est $User->test();

Re: Problème de Session POO

Posté : 09 nov. 2012, 01:00
par AB
Fichier A
<?php
class Student{
    private $full_name = '';
    private $score = 0;
    private $grades = array();
   
    public function __construct($full_name, $score, $grades)
    {
        $this->full_name = $full_name;
        $this->grades = $grades;
        $this->score = $score;
    }
   
    public function show_full_name()
    {
        echo $this->full_name;
    }
   
    public function show_score()
    {
        echo $this->score;
    }
	
    public function show_grades()
    {
        print_r($this->grades);
    }
	
    function __sleep()
    {
        return array('full_name','grades');
    }
   
    function __wakeup()
    {}
}

$student = new Student('bla bla', 'XXX', array('a' => 90, 'b' => 100));
$student->show_full_name();
$student->show_score();
$student->show_grades();

session_start();
$_SESSION['ma_class'] = $student;
?>
Fichier B
<?php
class Student{
    private $full_name = '';
    private $score = 0;
    private $grades = array();
   
    public function __construct($full_name, $score, $grades)
    {
        $this->full_name = $full_name;
        $this->grades = $grades;
        $this->score = $score;
    }
   
    public function show_full_name()
    {
        echo $this->full_name;
    }
   
    public function show_score()
    {
        echo $this->score;
    }
	
    public function show_grades()
    {
        print_r($this->grades);
    }
	
    function __sleep()
    {
        return array('full_name','grades');
    }
   
    function __wakeup()
    {}
}



session_start();
$a = $_SESSION['ma_class'];
$a->show_full_name();
$a->show_score();
$a->show_grades();
?>
Dans cet exemple j'ai utilisé __sleep et __wakeup (qui va avec) pour ne conserver que certaines variables qui sont énoncées dans __sleep.
Sinon tu peux te passer d'utiliser les fonctions __sleep et __wakeup (en les supprimant) et toutes tes variables seront sauvegardées.

Re: Problème de Session POO

Posté : 09 nov. 2012, 02:10
par miiidooo19
Houps :shock:

comme je suis débutant en POO comment je peux utilisé tes function dans mon exemple ?
j'ai pas compris l'utilité

Re: Problème de Session POO

Posté : 09 nov. 2012, 04:28
par AB
C'est pas pour que tu les utilise dans ton exemple c'est pour que tu les teste et comprendre comment ça fonctionne.
Tu crée un premier fichier et tu colle dedans le code du fichier A puis tu crée un second fichier et tu colle dedans le code du fichier B.
Ensuite tu lance ton premier fichier (qui contient de code A) et ensuite ton second fichier (qui contient de code B) et tu observe le résultat. Tu pourras aussi faire des tests en modifiant des fonctions etc.

Et comme je te l'ai déjà dit, les fonctions __sleep() et __wakeup() sont facultatives. Tu peux les supprimer. Elle permettent simplement par l'intermédiaire de la fonction __sleep(), de sélectionner les variables que tu veux transmettre lors de l'enregistrement en session. C'est surtout utile si tu as par exemple des variables encombrantes (qui prennent beaucoup de place en mémoire) et que tu n'as pas besoin de les transmettre car tu sais qu'elles ne seront pas exploitées dans ton fichier B (qui récupère l'objet par l'intermédiaire de la variable de session).

C'était juste pour te montrer les différentes possibilités pour transmettre un objet en session :wink:

A part cela je crois qu'avant la version php 5.3 ? il fallait obligatoirement sérialiser l'objet et donc le dé sérialiser à réception. Si tu veux un code qui marche aussi sur d'anciennes versions de php tu dois faire :
dans le fichier A : $_SESSION['ma_class'] = serialize($student); à la place de $_SESSION['ma_class'] = $student;
et dans le fichier B : $a = unserialize($_SESSION['ma_class']); à la place de $a = $_SESSION['ma_class'];

Re: Problème de Session POO

Posté : 09 nov. 2012, 09:50
par xTG
Concernant l'erreur vérifies bien que tu as inclus la définition de ta class avant l'endroit où tu extrais ta variable de la session.
Il se peut même qu'il faille l'inclure avant le session_start() j'avoue ne plus me rappeler quand il réinstancie l'objet...

Re: Problème de Session POO

Posté : 09 nov. 2012, 11:58
par miiidooo19
Merci AB pour les informations qui pourrai m'être utile aussi
et merci xTG j'ai réussi graçe a ton dernière message :)

la solution c'est qu'il faut inclure la class et instancé l'objet avant le session_start()

mais c'est bizard parce que j'ai entendé dire qu'il faut toujours placer session_star() avant tous le code

Re: Problème de Session POO

Posté : 09 nov. 2012, 15:25
par Mazarini
Je pense qu'il faut surtout mettre le session_start() avant d'envoyer quoique ce soit au navigateur. Ce qui est devenu, il faut le mettre en premier.

Re: Problème de Session POO

Posté : 09 nov. 2012, 18:29
par xTG
Le session_start() doit remplir la tête de la réponse en fait, donc on dit toujours de le mettre avant tout autre chose car beaucoup de personnes ne comprennent pas qu'en faisant un echo ou en utilisant header() on inscrit des choses dans la réponse.

Re: Problème de Session POO

Posté : 11 nov. 2012, 21:30
par AB
Oui en réalité on ne doit pas "toujours mettre session_start() en début de code", mais en le mettant en début de code on peut éviter plus facilement des erreurs donc finalement on conseille de le mettre au début.
Dans mes exemples, j'ai fais exprès de ne pas mettre session_start() en début de code pour te montrer l'endroit minimum où il fallait le mettre, c'est à dire avant l'utilisation - enregistrement ou lecture - des variables de session. Mais évidemment ça marcherait tout aussi bien si je l'avais mis en début de code.