2009-09-24 6 views
0

Y a-t-il un moyen de persister des objets dans PHP? Je crée des objets dans un script, mais je dois les créer à chaque fois que le script est exécuté (perdre son état sauf si je l'enregistre dans DB).Puis-je récupérer des objets que j'ai déjà utilisés?

Je sais que les variables peuvent être persistées avec $ _SESSION global, mais devrais-je enregistrer des objets dedans?

Si la persistance d'un objet n'est pas possible, à quoi sert la POO en PHP?

+8

Je ne peux pas commencer à imaginer comment la POO serait inutile sans objet persistence. –

+0

@jcinacio, amen. –

Répondre

1

La persistance de l'objet est possible, mais elle n'est pas automatiquement fournie. Vous devez soit l'écrire vous-même, soit utiliser un calque d'objet qui le fait pour vous. Donc, vous aurez probablement besoin d'une base de données.

PHP n'est pas un environnement dans lequel votre programme répond à plusieurs demandes de pages au fil du temps: à la place, votre programme est appelé pour répondre à une demande de page et se termine lorsqu'il est terminé. Le but du code orienté objet en PHP est de permettre de faire toute une série d'algorithmes et de styles de programmation, et de faciliter la réalisation d'une gamme encore plus étendue de solutions de codage. Oui, ils sont instanciés et détruits dans un seul appel de page, vous devez donc travailler dans ce paradigme. De nombreuses bases de code transmettent des ID d'objet entre les pages ou dans les sessions; dès qu'ils ont besoin de l'objet correspondant, il est instancié et chargé à partir du stockage persistant utilisant cet ID. Un bon calque d'objet rendra cela facile.

4

sérialiser l'objet avant de le stocker dans la session:

$s_obj = serialize($myObj); 
$_SESSION['myObj'] = $s_obj; 

et plus tard, pour récupérer et reconstruire:

$s_obj = $_SESSION['myObj']; 
$myObj = unserialize($s_obj); 
+0

Merci! J'ajoute des liens au cas où quelqu'un d'autre interviendrait: http://us2.php.net/manual/fr/language.oop.serialization.php http://us2.php.net/manual/fr/ function.serialize.php – Gerardo

3

Il n'y a pas besoin de sérialisation d'objets:

<?php 

class A 
{ 
    protected $name; 
    public function __construct($name) { $this->name = $name; } 
    public function getName() { return $this->name; } 
} 

session_start(); 

if (isset($_SESSION['obj'])) { 
    die($_SESSION['obj']->getName()); 
} 

$_SESSION['obj'] = new A('name'); 

?> 
1

D'accord avec jcinacio, pas besoin de sérialiser les valeurs avant de l'insérer dans $ _SESSION .. php gérera serialize/unserialize pour chaque requête/fin de page.

Une autre façon de persister des objets/sessions est de les sauvegarder dans un fichier/une base de données, en "émulant" le comportement de php. Dans ce cas, vous devrez sérialiser les valeurs pour les convertir en chaînes et les désérialiser une fois extraites de la base de données pour les convertir en objet.

Vous pouvez également être intéressé par les méthodes magiques __sleep et __wakeup de l'objet que vous allez sauvegarder. Ces méthodes sont appelées lors de la sérialisation/désérialisation l'objet, d'effectuer des actions telles que la connexion/déconnexion d'une base de données, etc.

[0] http://php.net/oop5.magic

1

Notez que si votre état est vraiment partagé entre les différents utilisateurs, vous ne voulez pas utiliser $ _SESSION. $ _SESSION est uniquement disponible dans le même utilisateur session - si vous avez 50 utilisateurs sur le site en même temps, chacun d'entre eux devra payer la pénalité de calcul au moins une fois.

Dans ces cas, vous pouvez utiliser un disque persistant basé sur le cache en mémoire (memcache).

Questions connexes