[POO] Variables de sessions dans les objets

Répondre
Rex
le 24/02/2005 à 13:44
Rex
<?php
class Test {
public $var = null;
}

session_start();

$_SESSION['objet'] = new Test();
$_SESSION['objet']->var;
?>


Maintenant, sur la page suivante, je fais :
<?php
session_start();
class Test {
public $var = null;
}
echo $_SESSION['objet']->var = 5;
?>


Sachant que le tableau $_SESSION est remplit lors de l'exécution de session_start, comment PHP peut savoir quelle est la structure de la classe à ce moment là puisqu'elle n'est pas encore déclarée ?

Enfin, j'dis ça, mais la doc l'explique mieux que moi ;-)
Un hamster dit : J'ai dressé le scientifique, quand j'appuie sur le bouton, il me donne des graines
Rex
le 24/02/2005 à 13:45
Rex
oups, j'me suis trompé entre l'affectation et l'affichage !
Un hamster dit : J'ai dressé le scientifique, quand j'appuie sur le bouton, il me donne des graines
keitarosan
le 24/02/2005 à 15:01
keitarosan
ouep, enfin c'est un cas precis ou l'on stocke un object dans une session. Ce qui n'est pas trop recommander d'ailleur, car ca alourdis le serveur (peut etre pas sur une centaine de connexion, mais sur les millers...)

Mais sinon, dans ce cas la effectivement :)
Enfin, ca doit rester rare je pense ^^
>> http://projectopensource.free.fr/index.php?m=2&m2=5&s=8 <<
rosema
le 25/02/2005 à 15:27
rosema
Mon sesion_start() est toujours en haut, au début de mes pages.
Pour les "commentaires" sur le script je suis ultra preneur même les plus méchants du moment que je peux en faire quelque chose.
L'idée de ma classe c'est de récuperer ou inserer des données dans ma table et éventuellement les mettre en session ou cookies, ça me sert énormément. Si c'est une connerie faut me le dire... :)
c 'est incroyable ce que je peux écrire comme conneries
Rex
le 25/02/2005 à 16:37
Rex
Bon, il y avait de TRES nombreuses erreurs.
La plus flagrante étant "if($session = true)". Avec un seul égal, ça ne peut pas fonctionner car c'est une affectation et non une comparaison.

Ensuite :

1/ affectes des variables locales et non des propriétés de classes inexistante ($requete et non $this->requete, cette dernière n'étant pas déclarée par un "var" dans la classe.
2/ Ton constructeur de classe ne servait à rien
3/ Je t'invite à découvrir les joies de la fonction implode et array_keys
4/ oublies "while(list=each)" et goûtes à la simplicité de "foreach"
5/ Ta méthode "insertion" avait des paramètres inutilisés ?!? ($session et $cookie)
6/ Pourquoi retourner "insertok" alors que ce sera TOUJOURS le cas sauf quand ça plante, mais il y a un "die"
7/ Oublies le "SELECT *"
8/ Pour un SELECT, c'est mysql_num_rows et non mysql_affected_rows
9/ Utilises mysql_fetch_assoc qui retourne directement un tableau associatif (ça fait sauter de nombreuses lignes de code)
10/ Utilises un entier plutôt que des paramètres booléens
11/ Evites de mélanger anglais et français ($requete et $result)
12/ Ton approche objet est à revoir. Tu ne sembles pas comprendre à quoi ça sert vraiment. Inutiles de faire des classes si c'est pour faire ce genre de chose.
Voilà, c'est déjà pas mal.
En prime, voici ton code revu (et encore je ne trouve pas ça très objet!):

"code dans le wall"

Pour expliquer le point N°10, regardes ceci :
<?php
$objet->recherche_entree( $champs, $condition, true, false );
?>

En lisant ce code sans regarder la signature de la méthode on ne sait pas à quoi correspond "true, false" alors que ceci :
<?php
$objet->recherche_entree( $champs, $condition, ENREGISTREMENT_SESSION );
?>

On sait que ça enregistre en session et
<?php
$objet->recherche_entree( $champs, $condition, ENREGISTREMENT_SESSION + ENREGISTREMENT_COOKIE);
?>

Ca fait les deux.
Un hamster dit : J'ai dressé le scientifique, quand j'appuie sur le bouton, il me donne des graines
Rex
le 28/02/2005 à 09:20
Rex
Autre remarque :

Mettre à jour les sessions ou les cookies depuis ta classe n'est pas une très bonne idée en terme de conception objet.

Accèder à une base de données et écrire dans la session, c'est deux monde complètement différent.
Le jour où tu vas changer de base de données, tu vas devoir réécrire aussi l'accès aux sessions.

Si on voulait faire de la POO un poil plus correcte, on devrait écrire de cette manière :

<?php
// Objet d'accès à la base de données qui hérite
// d'une classe nommé "BD"
$bd = new MySQL();
// AccessMaTable est une classe héritant d'une
// autre et qui contient directement le nom de
// la table où sont les données
$rechercher = new AccessMaTable($bd);
// On fixe les conditions
$rechercher->condition = $conditions;

// On lance la recherche et on remplit la session
$_SESSION['belette'] = $rechercher->execute();
?>


Ensuite, rien ne t'empêche de mettre ce code dans une fonction ou dans une autre classe spécialisée.

Bref, en POO, il faut décomposer le travail en composants élémentaires.

Avec ça, on peut imaginer changer la base de données et au lieu de faire "new MySQL()" on fait "new PostGresql" sans rien changer dans le reste du code.
Un hamster dit : J'ai dressé le scientifique, quand j'appuie sur le bouton, il me donne des graines
rosema
le 28/02/2005 à 17:08
rosema
Je te remercie du temps que tu as passé à me répondre. C'est assez clair, je pense que je vais en faire une fonction. désolé mais je viens de me mettre à POO sans aucun préalable scolaire donc je morfle un peu, mais c'est en programmant qu'on devient programmeur :)
c 'est incroyable ce que je peux écrire comme conneries
keitarosan
le 28/02/2005 à 17:18
keitarosan
tout a fait.

Le principal, c'est que tu comprennes bien comment ca marche...

Apres, ca viendras tout seul, avec quelques mois de codage ;)
>> http://projectopensource.free.fr/index.php?m=2&m2=5&s=8 <<
rosema
le 01/03/2005 à 08:31
rosema
un petit dernier truc je comprend pas très bien la syntaxe de la condition de cette ligne
<?php
if (0 !== ($type_enregistrement &ENREGISTREMENT_SESSION)) {
?>


Sinon je vais reprendre mon projet à 0. Je vais essayer de mieux définir mes objets avec ce que je pense avoir compris de la POO. Pour l'instant j'ai un objet site et un objet utilisateur je pense que c'est pas trop mal.
Merci encore
c 'est incroyable ce que je peux écrire comme conneries
Rex
le 01/03/2005 à 09:08
Rex
C'est de la logique binaire.
Si je fais "5 & 4", cela me donne ... "4", si je fais "5 & 2", cela me donne ... "0"

Dans l'exemple que tu cites, si $type_enregistrement contient ENREGISTREMENT_SESSION, cela va me retourner une valeur différente de "0" (la valeur de ENREGISTREMENT_SESSION pour être précis).

Lis mon dernier article "non aux booléens" car je viens de l'écrire suite à cette remarque.
Un hamster dit : J'ai dressé le scientifique, quand j'appuie sur le bouton, il me donne des graines
Répondre
LoadingChargement en cours