В настоящее время я занимаюсь разработкой библиотеки на PHP. Эта библиотека использует свое собственное пространство имен. Для хранения глобальных (в рамках пространства имен библиотеки) настроек я использую статический класс, подобный этому:
class Settings {
public static $verbose = true;
}
Чтобы сделать подробный вывод простым и адаптируемым, я использую такой статический метод:
class Log {
public static function v($msg) {
if ( ! Settings::$verbose) { return; }
echo $msg . "<br>\n";
}
}
Таким образом, я могу легко добавить подробный вывод в мой код:
Log::v('Answering questions...');
echo '42';
Однако этот подход создает множество ненужных вызовов методов, которые возвращаются сразу после деактивации подробного вывода.
Теперь я подумал об изменении моего подхода следующим образом:
class Log {
public static $v = false;
public static function init() {
self::$v = Settings::$verbose;
}
public static function v($msg) {
echo $msg . "<br>\n";
}
}
Я копирую значение Settings::$verbose
в Log::$v
только потому, что это короче. Сейчас — после звонка Log::init()
один раз — моя подробная строка выглядит так:
Log::$v && Log::v('All questions answered.');
Но эта строка не такая аккуратная / короткая, как просто печатать Log::v('')
, Мне не нравится мысль о необходимости печатать Log::$v && Log::v('')
всякий раз, когда я хочу добавить информацию о том, что происходит.
Мой вопрос: есть ли другой способ добавить подробный вывод с минимальным размером? Есть ли в PHP встроенные функции, о которых я не знаю?
Чтобы избежать конфликтов с другими компонентами, я хочу держать вещи в пространстве имен библиотеки, поэтому я не хочу использовать глобальную константу, такую как define('V', true)
,
Обновить: Я только что понял, что константы могут быть пространством имен, поэтому я мог изменить свой второй подход на:
define(__NAMESPACE__ . '\V', true);
V && Log::v('...');
Но мои вопросы остаются …
Задача ещё не решена.
Других решений пока нет …