Question

Je suis en train de suivre toutes les modifications apportées à une variable PHP. La variable peut être un objet ou d'un tableau.

Par exemple, il ressemble à quelque chose comme:

$object = array('a', 'b');

Cet objet est ensuite persisté au stockage en utilisant un cache d'objets. Lorsque le script PHP fonctionne à nouveau.

Ainsi, lorsque le script exécute la deuxième fois, ou un autre script exécute et modifie cet objet, je veux que ces modifications soient suivies, que ce soit comme ils sont en cours ou en une seule fois après l'exécution du script.

par exemple:

$object[] = 'c';

Je voudrais savoir que « c » a été ajouté à l'objet.

Maintenant, le code fait ressemble à quelque chose comme ceci:

$storage = new Storage();
$storage->object = array('a', 'b');

seconde charge:

$storage = new Storage();

var_dump($storage->object); // array('a', 'b')

$storage->object[] = 'c';

Ce que je veux savoir est que « c » a été poussé dans l'objet $ Stockage-> donc dans la classe « Storage » je peux mettre cette valeur à un stockage persistant.

Je l'ai essayé quelques méthodes, que le travail, mais ont des inconvénients.

1) Enveloppez tous les objets dans une classe "stockable" qui suit les modifications à l'objet

La classe « stockable » sauve tout l'objet de données réelles comme une propriété, et fournit ensuite des méthodes __get () et __set () pour y accéder. Lorsqu'un membre / propriété de l'objet est modifié ou ajouté, la classe « stockable », note ce. Lorsqu'une propriété est accessible __get () retourne sur la classe stockable la propriété, enveloppé dans une autre classe stockable afin que les changements sur qui sont suivis également, récursive pour chaque nouveau niveau.

Le problème est que les objets ne sont plus des types de données natives, et donc vous ne pouvez pas exécuter des fonctions de tableau sur les tableaux.

par exemple:

$storage = new Storage();

var_dump($storage->object); // array('a', 'b')

array_push($storage->object, 'c'); // fails

Ainsi, au lieu que nous aurions à mettre en œuvre ces fonctions de tableau comme méthodes de stockable.

par exemple:

$storage = new Storage();

var_dump($storage->object); // array('a', 'b')

$storage->object->push('c');

Tout cela est bien, mais je voudrais savoir s'il est possible d'utiliser les fonctions natives d'une certaine manière, de réduire les frais généraux de la bibliothèque que je développe, tout le suivi des changements afin des changements peuvent être ajoutés à un stockage persistant.

2) Oubliez le suivi des modifications, et simplement mettre à jour des structures entières d'objets

Ceci est la méthode la plus simple de garder les objets dans le programme synchronisé avec les objets effectivement stockés dans le cache d'objet (qui peut être sur une autre machine).

Cependant, cela signifie que les structures entières, comme un tableau avec des index 1000, doivent être envoyés bien qu'une prise à la mémoire cache d'objets lors d'un changement d'indice unique.

3) tenir un miroir de l'objet localement

J'ai aussi essayé de cloner l'objet, et de garder un objet clone intact. Ensuite, lorsque le traitement est effectué par le script PHP, comparer le clone à l'récursive objet modifié et propriétés ont changé de soumission retour à la cache d'objets.

Cela nécessite cependant que l'objet entier soit téléchargé afin de l'utiliser. Il faut aussi que l'objet prend deux fois plus de mémoire, car il est cloné.


Je sais que c'est assez vague, mais il y a assez peu de code impliqué. Si quelqu'un veut voir le code que je peux le poster ou le mettre sur un repo SVN ouvert. Le projet est open source, mais je n'ai pas encore mis en place un dépôt public.

Était-ce utile?

La solution

Étant donné que votre « objet » est vraiment un tableau, vous ne pouvez pas ajouter des fonctionnalités à elle. Votre idée d'encapsulation avec des méthodes de classe est la bonne approche. Se soucier de la performance sur la conception appropriée à ce stade est hors de propos et peu judicieux -. Les frais généraux que vous encourez cette approche sera probablement négligeable à votre performance globale de l'application

Vous devriez regarder dans les classes de tableau SPL tels que ArrayObject . Ils fournissent une interface semblable à un tableau complet et sont facilement extensibles.

Autres conseils

En toute honnêteté, je réexaminerait ce que vous faites. Vous êtes vraiment essayer de transformer en quelque chose de PHP ce n'est pas. C'est le genre de ORM que vous voyez en Java et C # pas PHP, qui est essentiellement de nature transitoire (ce qui signifie tout, sauf memcache / APC / etc, est recréée à chaque demande). Ceci est un anathème pour la mise en cache et le suivi des modifications objet sophistiqué.

Cela étant dit, la seule façon que vous pouvez faire est tout envelopper dans quelque chose qui surchargent __get(), __set() et __isset() et met en œuvre ArrayAccess .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top