Référence objet

demain
Invité n'ayant pas de compte PHPfrance

06 mars 2007, 15:19

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 !

Mammouth du PHP | 505 Messages

06 mars 2007, 21:31

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.

Invité
Invité n'ayant pas de compte PHPfrance

06 mars 2007, 22:17

On peut aussi les mettre en session et les déserialiser quand on en a besoin

Eléphanteau du PHP | 13 Messages

07 mars 2007, 00:10

Tu peux aussi utiliser des variables dites globales :
$GLOBALS['Param_name'];

Mammouth du PHP | 505 Messages

07 mars 2007, 09:33

christopher.... Les variables globales ne sont pas persistantes...

Modérateur PHPfrance
Modérateur PHPfrance | 6037 Messages

07 mars 2007, 13:42

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 ?
Règle n°2 du webmaster : Toujours commencer par le HTML qu'on veut obtenir....toujours ! :priere:
J'aime apprendre de nouvelles choses.

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

08 mars 2007, 11:13

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 ;)