Obtenez toutes les instances d'une classe en PHP
Je voudrais obtenir toutes les instances d'un objet d'une certaine classe.
Par exemple:
class Foo {
}
$a = new Foo();
$b = new Foo();
$instances = get_instances_of_class('Foo');
$instances
doit être array($a, $b)
ou array($b, $a)
(l'ordre n'a pas d'importance).
Un plus est si la fonction serait de retour instances qui ont une super-classe de la classe demandée, si ce n'est pas nécessaire.
Une méthode, je pense, à l'aide d'un membre de classe statique de la variable qui est titulaire d'un tableau d'instances. Dans le constructeur de la classe et destructeur, je voudrais ajouter ou supprimer des $this
de la matrice. C'est plutôt gênant et sujettes à l'erreur si je dois le faire sur un grand nombre de classes.
Pourquoi pensez-vous que vous en avez besoin?
J'ai besoin de cela parce que je fais un système d'événements et doivent être en mesure d'envoyer des événements à tous les objets d'une certaine classe (un mondial de la notification, si vous voulez, qui est lié dynamiquement).
J'ai besoin de cela parce que je fais un système d'événements et doivent être en mesure d'envoyer des événements à tous les objets d'une certaine classe (un mondial de la notification, si vous voulez, qui est lié dynamiquement).
OriginalL'auteur strager | 2009-01-24
Vous devez vous connecter pour publier un commentaire.
Si vous dérivez tous vos objets à partir d'un TrackableObject classe, cette classe pourrait être mis en place pour gérer de telles choses (juste être sûr que vous appelez
parent::__construct()
etparent::__destruct()
en cas de surcharge ceux dans les sous-classes.Le principal problème, c'est qu'aucun objet ne serait automatiquement récupérées par la collecte des ordures (en référence aux il existe encore au sein de
TrackableObject::$_instances
), de sorte__destruct()
aurait besoin d'être appelé manuellement à détruire l'objet. (Circulaire de Référence de la Collecte des Ordures a été ajouté en PHP 5.3 et peut présenter d'autres la collecte des ordures possibilités)Question: ne serait pas getInstances être statique?
Oui, il serait, il était assez tard quand j'ai tapé cette place, mais vous êtes tout à fait exact, Monsieur.
OriginalL'auteur Kenzal Hunter
Voici une solution possible:
Modifier: mise à Jour du code pour vérifier si le
$class
est une super-classe.Edit 2: Faites un peu de messier fonction récursive, qui vérifie chaque objet des variables au lieu de simplement les objets de plus haut niveau:
Je ne suis pas sûr si elle peut aller dans une récursion infinie avec certains objets, donc méfiez-vous...
J'ai mis à jour ma réponse avec une fonction récursive qui ressemble pour les instances à tous les membres de tous les objets (et de tous les membres de ces membres, ...).
Il y a un autre problème: les variables temporaires. Je ne pense pas que vous pouvez couvrir tous les coins avec $GLOBALS, qui permettrait d'introduire des bugs plus probable. Je suis sûr que votre méthode pourrait être utile pour quelqu'un d'autre, cependant, avec moins de besoins spécifiques.
get_object_vars
ne retourne que les membres du public. vous devez utiliser la Réflexion pour trouver des instances non-membres du public.OriginalL'auteur Jeremy Ruten
Je vous suggérerais d'avoir un objet séparé où vous vous inscrivez objets avec (Une modèle observateur). PHP a un support intégré pour ce, par le biais de la spl; Voir: SplObserver et SplSubject.
Donc, vous voulez un mondial de l'observateur? Vous pouvez soit créer une variable globale, ou vous pouvez passer la même instance à tous les Tchat de
OriginalL'auteur troelskn
Autant que je sache, l'exécution de PHP ne pas exposer l'objet sous-jacent de l'espace, de sorte qu'il ne serait pas possible de faire des requêtes pour les instances d'un objet.
OriginalL'auteur Cody Caughlan