Получите все экземпляры класса в PHP

Вы оказываете себе медвежью услугу, тестируя Splunk с такими минимальными событиями. Они не дают вам возможности увидеть, на что способен Splunk. Вы получаете только поля по умолчанию, потому что Splunk не знает, что делать с одним словом. Если бы вы что-то вроде "foo = bar", то вы увидели бы, что Splunk создает поле 'foo'.

На каждом компьютере есть как минимум один файл журнала, который вы можете использовать для тестирования Splunk.

Можно добавлять поля к событиям, используя преобразования. Это сложная тема, которую нельзя сделать с помощью графического интерфейса. Я предлагаю вам научиться ходить, используя лучшие образцы данных, прежде чем пытаться бежать.

10
задан hakre 18 December 2012 в 17:19
поделиться

4 ответа

При получении всех объектов из класса TrackableObject этот класс мог бы быть настроен для обработки таких вещей (просто уверены, что Вы звоните parent::__construct() и parent::__destruct() при перегрузке тех, которые в подклассах.

class TrackableObject
{
    protected static $_instances = array();

    public function __construct()
    {
        self::$_instances[] = $this;
    }

    public function __destruct()
    {
        unset(self::$_instances[array_search($this, self::$_instances, true)]);
    }

    /**
     * @param $includeSubclasses Optionally include subclasses in returned set
     * @returns array array of objects
     */
    public static function getInstances($includeSubclasses = false)
    {
        $return = array();
        foreach(self::$_instances as $instance) {
            if ($instance instanceof get_class($this)) {
                if ($includeSubclasses || (get_class($instance) === get_class($this)) {
                    $return[] = $instance;
                }
            }
        }
        return $return;
    }
}

Главная проблема с этим - то, что никакой объект не был бы автоматически взят сборкой "мусора" (поскольку ссылка на нее все еще существует в TrackableObject::$_instances), таким образом, __destruct() должен был бы быть назван вручную для уничтожения, сказал объект. (Сборка "мусора" Циклической ссылки была добавлена в PHP 5.3 и может представить дополнительные возможности сборки "мусора"),

16
ответ дан 3 December 2019 в 16:11
поделиться

Мне нужно это, потому что я делаю систему событий и потребность смочь к отправленным событиям ко всем объектам определенного класса (глобальное уведомление, если Вы будете, который динамично связывается).

Я предложил бы иметь отдельный объект, где Вы регистрируете объекты в (Шаблон "наблюдатель"). PHP имеет встроенную поддержку этого через spl; См.: SplObserver и SplSubject.

2
ответ дан 3 December 2019 в 16:11
поделиться

Вот возможное решение:

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;
}

Править: Обновленный код, чтобы проверить, если $class суперкласс.

Редактирование 2: Сделанный немного более грязной рекурсивной функцией, которая проверяет переменные каждого объекта вместо просто объектов верхнего уровня:

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;
}

Я не уверен, может ли это войти в бесконечную рекурсию с определенными объектами, поэтому остерегайтесь...

6
ответ дан 3 December 2019 в 16:11
поделиться

Насколько я знаю, время выполнения PHP не выставляет пространство основного объекта, таким образом, не было бы возможно запросить его для экземпляров объекта.

2
ответ дан 3 December 2019 в 16:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: