Page 1 sur 1

Référence objet

Posté : 06 mars 2007, 15:19
par demain
Bonjour,

je me posé la question suivante :

Est-il possible de garder en mémoire des références sur des objets ou des objets complets comme peut le faire JAVA par exemple.

Si vous pouviez me donner quelques exemples concrets ou un lien vers un site qui traite du sujet.

Merci !

Posté : 06 mars 2007, 21:31
par titerm
La durée de vie d'un objet en php est celle de l'affichage d'une page web.
Ce que tu peux faire tout au plus, c'est sérialiser ton objet avant sa destruction et le déserialiser en début de page. La zone ou tu stockes les versions sérialisés ne dépend que de toi... cela peut etre une BDD, du HDD ou de la ram via APC par exemple.

Posté : 06 mars 2007, 22:17
par Invité
On peut aussi les mettre en session et les déserialiser quand on en a besoin

Posté : 07 mars 2007, 00:10
par christopher
Tu peux aussi utiliser des variables dites globales :
$GLOBALS['Param_name'];

Posté : 07 mars 2007, 09:33
par titerm
christopher.... Les variables globales ne sont pas persistantes...

Re: Référence objet

Posté : 07 mars 2007, 13:42
par mere-teresa
Est-il possible de garder en mémoire des références sur des objets ou des objets complets comme peut le faire JAVA par exemple.
Quel en est l'intérêt ?

Posté : 08 mars 2007, 11:13
par naholyr
Des solutions ORM le permettent de façon transparente. J'utilise par exemple ezPdo dans plusieurs projets, cela me fait gagner énormément de temps puisque je ne fais plus aucune requête SQL pour la persistance des données (on perd bien sûr en performance). Imaginons qu'on gère une bibliothèque. On va gérer des objets Livre. Pour ajouter un livre à la bibliothèque j'aurai ce type de code :
$epm = epManager::instance();
// on charge notre bibliothèque (objet persistant unique, donc le résultat sera toujours un tableau de taille 1).
$bibliothèque = $epm->find('from Bibliotheque')[0];
// on crée le livre
$livre = $epm->create('Livre');
$livre->titre = "Titre du livre";
... etc ...
// on ajoute le livre à la bibliothèque
$bibliothèque->livres[] = $livre;
Et mon livre est ajouté à la bibliothèque. Quand je retournerai sur la page listant les livres :
$epm = epManager::instance();
$bibliothèque = $epm->find('from Bibliotheque')[0];
foreach ($bibliothèque->livres as $livre) {
    echo $livre->titre . '<br/>';
}
Mon livre apparaîtra bien. Pas de session, pas de requête affichée ni dans le code métier, ni dans l'implémentation de la classe (il y a juste des commentaires /** @orm ... **/ au-dessus des déclarations d'attributs).

C'est le genre de chose permise en "standard" par Java, et rendu possible grâce à ce genre de librairie qui permettent la persistance des données objet de manière transparente. De base ça stocke l'objet en base de données, donc ça limite les performances. Il y a cependant quelques patchs permettant d'utiliser des extensions comme memcache qui permettront de garder l'objet dans la mémoire vive du serveur (l'objet est alors stocké en base ET en ram, la lecture se fait sur la ram, la modification se fait sur la ram et sur la base), et là autant dire qu'on va à l'inverse gagner en performance ;)