2010-01-31 20 views
6

Ok, mein Problem ist wie folgt;Auflistung aller Objekte einer bestimmten Klasse

Ich habe eine Klasse, die ein Haustier mit diesem Konstruktor beschreibt;

public function __construct($name, $type, $age) 

Also, was ich tun möchte, ist eine Reihe von PET-Objekte machen, dann habe ich alle Attribute aller Objekte dieser Klasse drucken möchten, so dass es so etwas wie this

sieht Was ist beste Art, das zu tun? Ich weiß, wie man durch die Variablen eines Objekts iteriert, aber mein Hauptanliegen ist, wie man durch alle Gegenstände einer bestimmten Klasse iteriert. Ich würde es lieben, wenn jemand mir ein Codebeispiel von etwas zeigen könnte, besonders wenn es einen Weg gibt, es ohne die Verwendung von Arrays zu tun.

Jede Hilfe wird geschätzt!

+0

Duplizieren: http://stackoverflow.com/questions/475569/get-all-instances-of-a-class-in-php/483094 – troelskn

Antwort

1

Normalerweise würde man erwarten, dass eine Möglichkeit haben, die Instanzen Tracking Sie erstellt haben, vielleicht in einem Array oder irgendeiner Art von Klasse.

Aber aus Gründen der Argumentation, könnten Sie alle Variablen im aktuellen Bereich mit get_defined_vars() überprüfen, rekursiv alle Arrays suchen oder Sie Objekte finden, mit so etwas wie folgt aus:

function findInstancesOf($classname, $vars) 
{ 
    foreach($vars as $name=>$var) 
    { 
     if (is_a($var, classname)) 
     { 
      //dump it here 
      echo "$name is a $classname<br>"; 

     } 
     elseif(is_array($var)) 
     { 
      //recursively search array  
      findInstancesOf($classname, $var); 
     } 
     elseif(is_object($var)) 
     { 
      //recursively search object members 
      $members=get_object_var($var);  
      findInstancesOf($classname, $members); 
     } 
    } 
} 

$vars = get_defined_vars(); 
findInstancesOf('MyPetClass', $vars); 
5

Sie könnten in der Klasse Konstruktor, hängen $this auf ein statisches Array, das alle Elemente dieser Art hält:

class Pet { 
    public static $allPets = array(); 
    function __construct($name, $type, $age) { 
     self::$allPets[] = $this; 
     // more construction 
    } 
} 

Ihre Liste aller Pet-Objekte ist jetzt in Pet::$allPets.

1

Ich denke, es hängt von Ihrer Struktur ab, aber ich hätte ein anderes Objekt/eine Klasse, die alle generierten Haustierobjekte enthält, also würde ich das durchgehen.

+0

vielleicht ein Beispiel dafür, wie dieses Ziel schaffen würde helfen ? – DForck42

1

Nun, könnten Sie eine benutzerdefinierte Option schaffen machen und statische Variablen verwenden, um eine Instanz jeder Klasse erstellt speichern

Class Pet 
{ 
    public static $pets = array(); 
    public static create($name, $type, $age) 
    { 
     $pet = new Pet($name, $type, $age); 
     self::$pets[] = $pet; 
     return $pet; 
    } 
} 
Pet::createPet("test", "test", 42); 
Pet::createPet("test", "test", 42); 
Pet::createPet("test", "test", 42); 

foreach(Pet::$pets as $pet) 
{ 
    echo $pet->name; 
} 
1

ich ein foreach machen würde Schleife

foreach($myobject as $key => $pent) 
{ 
echo $key; 
echo $pent; 

} 
Verwandte Themen