8795 sujets

Développement web côté serveur, CMS

Bonjour,

Je me demande pourquoi session_start() doit être placé uniquement aprés les fichiers inclus qui contiennent des déclarations de classe ? Smiley eek

merci
Modérateur
Et l'eau,

Je ne comprends pas bien ta question. Un bout de code ce serait bien. Sinon ça me parait logique.

1. définition des modèles

class uneClasse{
//...
}

2. action (logique de l'application) (session start)

try{
session_start();
$x = new uneClasse();
//...
}catch(Exception $e){
//....
}

3. rendu dans le navigateur

<p><?php echo $x ?></p>
<!-- .... -->
Là j'ai rien compris à ta réponse mais merci quand même Smiley smile

En faite session_star() sert à créer ou récupérer l'id de session placé dans un cookie,
je comprend pas pk lorsqu'il y a des déclarations de classe aprés ça fonctionne bien , mais si la déclaration de classe est dans un fichier inclu ça fonctionne plus.
Salut,

il ne faut rien afficher au navigateur avant de faire session_start().
Les fichiers que tu inclus on sûrement des espaces ou des sauts de ligne.

Ce fichier envoi un saut de ligne au navigateur car il y a un saut de ligne apès '?>':

<?php
class {...}
?>



Ce fichier n'affiche rien (pas de balise fermante php):

<?php
class {...}

le probleme justement c'est que session_star() il veux absolument que les déclarations de classe inclusent dans des fichier lui soit précédé, sinon il affiche cette erreur :

Notice: main(): The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition &quot;MaClasse&quot; 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 ...

mais si je sérialise la référence de l'objet que j'ai enregistrer dans la variable de session et qu'ensuite de désérialise ça fonctionne Smiley eek Smiley eek
En même temps, si tu n'indique pas l'erreur…
Les sessions ne sont composer que de chaîne de caractère. Php va automatiquement sérialiser l'objet à l'appel de session_write_close() (ou à la fin du script) et le dé-sérialiser à l'appel de session_start().
Donc oui, pour dé-sérialiser un objet, il faut déjà le connaître, d’où l'erreur.

Tu peux aussi regarder autoload pour faire des include automatique.
si php sériale et désérialise automatiquement à l'apelle de saission_star() raison de plus pour placer session_star() avant les includes, en faite j'ai trouvé si ça fonctionne que si je sérialise manuelment c'est qu'il a un problemme avec le nom de ma variable de session , en gros il veu pas qu'elle est le même nom que son objet de référence. Smiley eek Smiley eek
depuis quand une variable na pas le droit d'avoir le meme nom qu'une variable de session si elle représente un objet Smiley biggol Smiley biggol
J'aimerais bien t'aider mais je ne comprends rien à ce que tu racontes. Smiley lol

Tout ce que je sais c'est si tu sauves un objet dans une variable de session, lors de l'appel ultérieur à session_start(), PHP va déserialiser ton objet et en créer une instance, donc si ta classe n'est pas incluse (par un include ou via __autoload) il ne pourra pas le faire.

Y'a pas à chercher plus loin, je sais pas pourquoi tu te compliques le sujet.
Modifié par jb_gfx (01 Jul 2012 - 20:29)
donc c logique , pour pouvoir instancier l'objet (graçe à session_star()) php à besoin des déclarations de classes avant session_star(), je savait qu'il me manqué une conaissance pour comprendre.

donc se qui explique pk sa marche si je serialise et désérialise manuelement, php instancie toujours aprés un désérialise, je vai téster désérialiser manuelement avant les includes et je tien au courant Smiley lol

merci
Modifié par perfectionniste (01 Jul 2012 - 20:45)
ok résolut, mais je ne comprend pas pourquoi dans mon bouquin , il ne dit pas que session_star() fait ça , bref résolut merciiiiiiii Smiley cligne
perfectionniste a écrit :
ok résolut, mais je ne comprend pas pourquoi dans mon bouquin , il ne dit pas que session_star() fait ça , bref résolut merciiiiiiii Smiley cligne


Parce que t'as acheté un bouquin pourri ? Smiley smile