Перечисление всех объектов определенного класса - PullRequest
6 голосов
/ 31 января 2010

Хорошо, моя проблема заключается в следующем;

У меня есть класс, который описывает питомца с помощью этого конструктора;

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

Итак, я хочу создать несколько объектов питомца, затем я хочу напечатать все атрибуты всех объектов этого класса, чтобы он выглядел примерно как this

Как лучше всего это сделать? Я знаю, как перебирать переменные объекта, но моя главная задача - как перебрать все объекты определенного класса. Я был бы рад, если бы кто-нибудь мог показать мне пример кода чего-либо, особенно если есть способ сделать это без использования массивов.

Любая помощь приветствуется!

Ответы [ 5 ]

6 голосов
/ 31 января 2010

Вы можете добавить в конструктор класса $this к статическому массиву, в котором хранятся все элементы этого типа:

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

Ваш список всех объектов питомцев теперь находится в Pet::$allPets.

1 голос
/ 31 января 2010

я бы сделал цикл foreach

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

}
1 голос
/ 31 января 2010

Обычно вы ожидаете, что у вас будет какой-то способ отслеживания созданных вами экземпляров, возможно, в массиве или в каком-то другом классе.

Но ради аргумента вы можете проверить все переменные в текущей области с помощью get_defined_vars () , рекурсивно ища любые найденные массивы или объекты, с чем-то вроде этого:

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);
1 голос
/ 31 января 2010

Ну, вы могли бы сделать пользовательскую опцию создания и использовать статические переменные для хранения экземпляра каждого созданного класса

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 голос
/ 31 января 2010

Полагаю, это зависит от вашей структуры, но у меня есть другой объект / класс, содержащий все сгенерированные объекты домашних животных, поэтому я бы повторил это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...