2010-01-31 27 views
6

Ok vấn đề của tôi là như sau;Liệt kê tất cả các đối tượng của một lớp nhất định

Tôi có một lớp mô tả một thú cưng với người xây dựng này;

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

Vì vậy, những gì tôi muốn làm là làm cho một số đối tượng vật nuôi, sau đó tôi muốn in tất cả các thuộc tính của tất cả các đối tượng của lớp này để nó trông giống như this

là gì cách tốt nhất để đi về nó? Tôi biết làm thế nào để lặp qua các biến của một đối tượng, nhưng mối quan tâm chính của tôi là làm thế nào để lặp qua tất cả các đối tượng của một lớp nhất định. Tôi rất thích nó nếu ai đó có thể chỉ cho tôi một ví dụ mã của một cái gì đó, đặc biệt nếu có một cách để làm điều đó mà không cần sử dụng mảng.

Mọi trợ giúp đều được đánh giá cao!

+0

trùng lặp: http://stackoverflow.com/questions/475569/get-all-instances-of-a-class-in-php/483094 – troelskn

Trả lời

1

Thông thường bạn sẽ mong đợi để có một số cách để theo dõi các trường hợp bạn đã tạo ra, có lẽ trong một mảng hoặc một số loại lớp có chứa.

Nhưng vì lợi ích của đối số, bạn có thể kiểm tra tất cả các biến trong phạm vi hiện tại với get_defined_vars(), đệ quy tìm kiếm bất kỳ mảng hoặc đối tượng bạn tìm thấy, với một cái gì đó như thế này:

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

Bạn có thể, trong các nhà xây dựng lớp, thêm $this đến một mảng tĩnh mà giữ tất cả các yếu tố của loại hình này:

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

Danh sách của bạn của tất cả các đối tượng vật nuôi hiện đang ở Pet::$allPets.

1

Tôi đoán nó phụ thuộc vào cấu trúc của bạn, nhưng tôi có một đối tượng/lớp khác có chứa tất cả các đối tượng vật nuôi được tạo ra, vì vậy tôi sẽ lặp lại điều đó.

+0

lẽ một ví dụ về làm thế nào để tạo ra đối tượng này sẽ giúp ? – DForck42

1

Vâng, bạn có thể làm cho một phong tục tạo lựa chọn và sử dụng các biến tĩnh để lưu trữ một thể hiện của mỗi lớp tạo

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

tôi sẽ làm cho một foreach loop

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

} 
Các vấn đề liên quan