Какой лучший способ управлять синглтоном? - PullRequest
1 голос
/ 12 декабря 2008

Я возиться с различными фреймворками логирования PHP. Я сейчас пытаюсь PEAR :: Log. Я решил, что воспользуюсь его функцией singleton, чтобы убедиться, что существует только один экземпляр класса.

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

У меня вопрос: как мне лучше всего управлять этим синглтоном?

Для меня это так:

&Log::singleton($handler, $name, $ident, $conf, $maxLevel);

в каждой функции не кажется идеальным, тем более что я уже указал все параметры при первоначальном вызове. Pear :: Log сериализует эту информацию, но, судя по всему, вам все равно нужно предоставить все эти переменные, чтобы получить экземпляр.

Другая альтернатива - передача экземпляра в каждую функцию. Опять же, похоже, что это не идеально.

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

Что вы в этой ситуации? Есть ли лучшие решения?

Ответы [ 4 ]

3 голосов
/ 12 декабря 2008

Еще лучше, если ваша конечная цель состоит в том, чтобы просто иметь возможность слепо звонить

Logger::Write("Something happened");

везде, где вам это нужно, вы можете сделать еще одно решение Михала с помощью

class Logger {
    private static $log = null;

    public static function init(Log $log) {
        self::$log = $log;
    }

    public static function Write(String $str) {
        if($log == null)
            init(Log::singleton(...));

        $this->log->Write($str);
    }
}

Таким образом, ваш журнал будет инициализирован один раз, при первом использовании.

1 голос
/ 12 декабря 2008

Просто используйте глобальный экземпляр. Где-то у вас должен быть файл, который должны включать все остальные файлы. Просто создай это там. Если у вас есть что-то против глобальных переменных, вы, вероятно, не должны программировать на PHP.

1 голос
/ 12 декабря 2008

Я мало что знаю о PEAR :: Log, но почему бы не создать еще один синглтон, который упаковывает / упрощает ведение журнала.

class Logger {

    private static $log;

    private function __construct() { }

    public static function init(Log $log) {
        self::$log = $log;
    }

    public static function get() {
        return self::$log;
    }

}

После инициализации Logger с экземпляром Log вы можете получить к нему доступ через Logger::get. Поскольку разыменование возможно в PHP, вы можете сделать

Logger::get()->doSomething($foo, $bar);
0 голосов
/ 12 декабря 2008

Другая альтернатива - передача экземпляра в каждую функцию. Опять же, похоже, что это не идеально.

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

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