Erhalte alle Instanzen einer Klasse in PHP



Answers

Hier ist eine mögliche Lösung:

function get_instances_of_class($class) {
    $instances = array();

    foreach ($GLOBALS as $value) {
        if (is_a($value, $class) || is_subclass_of($value, $class)) {
            array_push($instances, $value);
        }
    }

    return $instances;
}

Bearbeiten : Aktualisierte den Code, um zu überprüfen, ob die $class eine Oberklasse ist.

Edit 2 : Eine etwas unordentlichere rekursive Funktion, die die Variablen jedes Objekts und nicht nur die Objekte der obersten Ebene überprüft:

function get_instances_of_class($class, $vars=null) {
    if ($vars == null) {
        $vars = $GLOBALS;
    }

    $instances = array();

    foreach ($vars as $value) {
        if (is_a($value, $class)) {
            array_push($instances, $value);
        }

        $object_vars = get_object_vars($value);
        if ($object_vars) {
            $instances = array_merge($instances, get_instances_of_class($class, $object_vars));
        }
    }

    return $instances;
}

Ich bin mir nicht sicher, ob es mit bestimmten Objekten in unendliche Rekursion gehen kann, also hüte dich ...

Question

Ich möchte alle Instanzen eines Objekts einer bestimmten Klasse erhalten.

Beispielsweise:

class Foo {
}

$a = new Foo();
$b = new Foo();

$instances = get_instances_of_class('Foo');

$instances sollten entweder array($a, $b) oder array($b, $a) (Reihenfolge spielt keine Rolle).

Ein Plus ist, wenn die Funktion Instanzen zurückgeben würde, die eine Oberklasse der angeforderten Klasse haben, obwohl dies nicht notwendig ist.

Eine Methode, die ich mir vorstellen kann, ist die Verwendung einer statischen Klassenmitgliedsvariablen, die ein Array von Instanzen enthält. Im Konstruktor und im Destruktor der Klasse würde ich $this aus dem Array hinzufügen oder entfernen. Das ist ziemlich problematisch und fehleranfällig, wenn ich es in vielen Klassen machen muss.




Soweit ich weiß, stellt die PHP-Laufzeitumgebung den zugrunde liegenden Objektbereich nicht zur Verfügung, so dass es nicht möglich wäre, ihn nach Instanzen eines Objekts abzufragen.






Links