OVH Cloud OVH Cloud

Variable globale, Variable objet et Session

5 réponses
Avatar
oam
Bonjour,

J'ai un ancien code écrit en PHP 4.2, que je suis en train de modifier pour
qu'il fonctionne en PHP 5.1.
Il y a malheureusement beaucoup de variables globales à supprimer.
Pour cela j'utilise les tableaux superglobaux et les sessions ; la seule
méthode que j'ai trouvée... Si il en existe d'autres, je suis preneur !

Ainsi $ma_variable_de_session devient $_SESSION['ma_variable_de_session'] si
la variable est simple et pour pour les tableaux $ma_variable_de_session[i]
devient $_SESSION['ma_variable_de_session'][i].

Mon problème vient des variables objets. Comment faire passer une variable
objet (ex. var_objet->propriete) ?
$_SESSION['var_objet->propriete'] ne fonctione pas !

En surfant sur le net j'ai pu trouver qu'il fallait employer les fonctions
serialize et unserialize.
Est-ce la seule méthode ?

Merci d'avance !

Olivier.

5 réponses

Avatar
bruno at modulix
oam wrote:
Bonjour,

J'ai un ancien code écrit en PHP 4.2, que je suis en train de modifier pour
qu'il fonctionne en PHP 5.1.
Il y a malheureusement beaucoup de variables globales à supprimer.
Pour cela j'utilise les tableaux superglobaux et les sessions ; la seule
méthode que j'ai trouvée... Si il en existe d'autres, je suis preneur !

Ainsi $ma_variable_de_session devient $_SESSION['ma_variable_de_session'] si
la variable est simple et pour pour les tableaux $ma_variable_de_session[i]
devient $_SESSION['ma_variable_de_session'][i].

Mon problème vient des variables objets. Comment faire passer une variable
objet (ex. var_objet->propriete) ?


$var_objet->propriete n'est pas une "variable objet", c'est un attribut
(une "donnée membre", en dialecte C++) d'un objet. La "variable objet",
ici, c'est $var_objet.

$_SESSION['var_objet->propriete'] ne fonctione pas !


Si, très bien :

$_SESSION['var_objet->propriete'] = 42;
echo $_SESSION['var_objet->propriete'];

Mais ce n'est effectivement probablement pas ce que tu veux !-)

En surfant sur le net j'ai pu trouver qu'il fallait employer les fonctions
serialize et unserialize.
Est-ce la seule méthode ?


En php4, le code suivant fonctionne:

# page 1
require_once('toto.php');

$toto =& new Toto();
$toto->answer = 42;
$_SESSION['toto'] = $toto;

// ...

# page 2
// penser à ça avant, sinon PHP pas content
require_once('toto.php');

//...

$toto = $_SESSION['toto'];
echo $toto->answer;


(NB : exemple simplistico-stupide of course, dans la vrai vie on fait
plus propre...)

PHP se charge lui-même de sérialiser/désérialiser les objets.

--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in ''.split('@')])"

Avatar
Eric
Mon problème vient des variables objets. Comment faire passer une variable
objet (ex. var_objet->propriete) ?
$_SESSION['var_objet->propriete'] ne fonctione pas !


Et $_SESSION['var_objet']->propriete ?

Avatar
oam
$var_objet->propriete n'est pas une "variable objet", c'est un attribut
(une "donnée membre", en dialecte C++) d'un objet. La "variable objet",
ici, c'est $var_objet.


Merci pour cette précision de vocabulaire qui est toujours utile.


$_SESSION['var_objet->propriete'] ne fonctione pas !


Si, très bien :

$_SESSION['var_objet->propriete'] = 42;
echo $_SESSION['var_objet->propriete'];


Non cela ne fonctionne pas si par exemple tu définis dans la déclaration de
la class une valeur par défaut pour la propriété. Par contre la (les)
solution(s) suivante(s) fonctionne(nt) :
<?php
session_start();

class voiture {
public $marque = 'ferrari';
}

$_SESSION['mavoiture'] = new voiture();
// ou encore : $mavoiture = new voiture();

echo('Ma voiture : '.$_SESSION['mavoiture']->marque);
?>


Mais ce n'est effectivement probablement pas ce que tu veux !-)

En surfant sur le net j'ai pu trouver qu'il fallait employer les
fonctions
serialize et unserialize.
Est-ce la seule méthode ?


En php4, le code suivant fonctionne:

# page 1
require_once('toto.php');

$toto =& new Toto();
$toto->answer = 42;
$_SESSION['toto'] = $toto;

// ...

# page 2
// penser à ça avant, sinon PHP pas content
require_once('toto.php');

//...

$toto = $_SESSION['toto'];
echo $toto->answer;


(NB : exemple simplistico-stupide of course, dans la vrai vie on fait
plus propre...)

PHP se charge lui-même de sérialiser/désérialiser les objets.


Je n'ai pas compris ce que tu mettais dans toto.php ! Peux tu être un peu
plus explicite ?
Par ailleur, $_SESSION['toto'] = $toto; et $toto = $_SESSION['toto']; n'est
ce pas la même chose que $_SESSION['toto'] = serialize($toto); et $toto =
unserialize($_SESSION['$toto']); mais en une écriture raccoucie, PHP se
chargeant de l'interpréter ?


Avatar
oam
"Eric" a écrit dans le message de news:

Mon problème vient des variables objets. Comment faire passer une
variable
objet (ex. var_objet->propriete) ?
$_SESSION['var_objet->propriete'] ne fonctione pas !


Et $_SESSION['var_objet']->propriete ?


Exact ca fonctionne impécablement !

<?php
session_start();

class voiture {
public $marque = 'ferrari';
}

$_SESSION['mavoiture'] = new voiture();
echo('Ma voiture : '.$_SESSION['mavoiture']->marque);
?>


Avatar
bruno at modulix
oam wrote:
$var_objet->propriete n'est pas une "variable objet", c'est un attribut
(une "donnée membre", en dialecte C++) d'un objet. La "variable objet",
ici, c'est $var_objet.



Merci pour cette précision de vocabulaire qui est toujours utile.


$_SESSION['var_objet->propriete'] ne fonctione pas !


Si, très bien :

$_SESSION['var_objet->propriete'] = 42;
echo $_SESSION['var_objet->propriete'];



Non cela ne fonctionne pas


Si si. Ca fonctionne parfaitement - mais pas *du tout* comme tu l'espères.

La chaine 'var_objet->propriete' est une clée valide pour un tableau.
Donc le code ci-dessus crée dans $_SESSION une entrée pour la clé
(littéralement) 'var_objet->propriete', et lui affecte la valeur 42. Le
fait que cette clé ressemble à du code PHP ne signifie pas qu'elle soit
interprétée comme du code PHP !-)

Mais ça n'a bien sûr aucun rapport avec ce que tu voudrais...

(snip)

En php4, le code suivant fonctionne:

# page 1
require_once('toto.php');

$toto =& new Toto();
$toto->answer = 42;
$_SESSION['toto'] = $toto;

// ...

# page 2
// penser à ça avant, sinon PHP pas content
require_once('toto.php');

//...

$toto = $_SESSION['toto'];
echo $toto->answer;


(NB : exemple simplistico-stupide of course, dans la vrai vie on fait
plus propre...)

PHP se charge lui-même de sérialiser/désérialiser les objets.



Je n'ai pas compris ce que tu mettais dans toto.php ! Peux tu être un peu
plus explicite ?


La définition de la classe Toto. Ca me semblait assez évident, mais
j'aurais peut-être dû le préciser en effet?

Par ailleur, $_SESSION['toto'] = $toto; et $toto = $_SESSION['toto']; n'est
ce pas la même chose que $_SESSION['toto'] = serialize($toto); et $toto =
unserialize($_SESSION['$toto']); mais en une écriture raccoucie, PHP se
chargeant de l'interpréter ?


Pas tout à fait :

# -------------------------
require_once('toto.php');
session_start();

//...

if (empty($_SESSION['toto']) {
$_SESSION['toto'] = new Toto();
$_SESSION['toto']->answer = 42;
}

//...

echo $_SESSION['toto']->answer
# -------------------------


Si j'avais explicitement sérialisé toto, il faudrais que le désérialise
explicitement aussi - alors que là, je peux utiliser directement
$_SESSION['toto'].


--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in ''.split('@')])"