Tableau associatif contre SplObjectStorage
Je suis en train de travailler sur le code pour gérer une collection d'objets uniques. Le premier prototype de ce code utilise un tableau associatif, en gros que c'est la façon dont je l'ai toujours fait.
Cependant, je suis également désireux de prendre avantage de la fonctionnalité qui a été ajoutée à des versions plus modernes de PHP comme SplObjectStorage pour ce faire, au lieu de cela, en partie comme une expérience d'apprentissage, en partie parce qu'il est lié à offrir des avantages (benchmarks que j'ai vu suggèrent que SplObjectStorage peut être plus rapide que les tableaux, dans beaucoup de cas).
La mise en œuvre actuelle a un tableau associatif que je vérifie avec in_array pour voir si un objet est déjà dans le tableau avant d'ajouter un nouvel objet à elle.
Le gros problème que je peux voir avec SplObjectStorage est qu'il ne semble pas (à première vue) à l'appui de clé/valeur tableau associatif comportement, et ne peut être traitée comme un tableau indexé. Toutefois, la documentation pour les nouvelles fonctionnalités de PHP n'est pas à la hauteur des normes de la documentation de plus établi les parties de la langue et j'ai peut être raté quelque chose.
Puis-je utiliser SplObjectStorage en place d'un tableau associatif? Si oui, comment dois-je définir la clé lors de l'ajout d'un nouvel objet? Plus important encore, quels sont les avantages et les inconvénients de SplObjectStorage lorsque par rapport aux tableaux associatifs?
- double possible de SplObjectStorage ne fonctionne pas avec de la Ficelle, que faire?
- Je ne pense pas que ma question est toute semblable à celle que vous avez indiqué.
- lire ce nouveau
- Pris un peu plus près, mais ne voyez toujours pas comment mon problème (Peut-on utiliser SplObjectStorage en place d'un associatif array et si oui, quels sont les avantages et les inconvénients?) est un doublon de celui-ci (Pourquoi ne puis-je pas mettre les chaînes dans un SplObjectStorage?)
- Je pense que la question a suggéré si vous voulez faire associer tableau, puis utilisez la spl objet de hachage, et l'attacher à la spl objet de stockage. Inconvénient? est gênante. Les avantages de la spl objet de stockage est parce que c'est à l'aide de la clé d'index (voir la mise en œuvre utilisez uniquement next,prev pour faire avancer le pointeur).Et de remettre à associer la clé est juste à l'encontre du but. C'est ce que je pensais.
Vous devez vous connecter pour publier un commentaire.
Vous ne devriez pas voir
SplObjectStorage
comme une valeur-clé magasin, mais simplement un ensemble d'objets. Quelque chose est dans le jeu ou pas, mais ses position n'est pas important.La "clé" d'un élément dans le
SplObjectStorage
est en fait la valeur de hachage de l'objet. Il fait qu'il n'est pas possible d'ajouter plusieurs copies de la même instance d'objet à unSplObjectStorage
, de sorte que vous n'avez pas à vérifier si une copie existe déjà avant de l'ajouter.Cependant, dans
PHP 5.4
il y a une nouvelle méthode appeléegetHash()
laquelle vous pouvez modifier ce sera le retour de la "hash" de l'objet. - Dans un sens - retours/définir la clé de sorte que vous pouvez lui permettre de stocker dans des conditions différentes.Le principal avantage de
SplObjectStorage
est le fait que vous gagnez beaucoup de méthodes pour gérer et d'interagir avec les différents ensembles (contains()
,removeAll()
,removeAllExcept()
etc). Sa vitesse est légèrement mieux, mais le l'utilisation de la mémoire est pire que la normale tableaux PHP.Résultats après l'exécution de référence avec 10000 itérations sur
PHP 5.6.13
:Comme vous pouvez le voir,
Array
est pas sensiblement plus rapide queSplObjectStorage
, mais l'utilisation 34 % moins de mémoire.Lorsque toute la mémoire allouée à la matrice est utilisée, la mémoire allouée sera doublé. Dans ce contexte, une collection d'objets peut être plus efficace de la structure.