Лучший способ передать / использовать класс отладки в PHP библиотеках - PullRequest
0 голосов
/ 11 февраля 2020

Я обычно использую Monolog для своих PHP журналирования и отладки, но обнаружил, что каждый из моих классов в итоге создает собственный Monolog \ Logger, что хорошо для проекта с одним или двумя классами в нем, но Я хочу поделиться этими классами между несколькими проектами, используя Composer et c. Чтобы каждый класс не использовал свой собственный регистратор, я в настоящее время использую следующий код, который просто позволяет мне передать экземпляр Logger, если он настроен, а если нет, то класс сам устанавливает регистратор Null:

    /**
     * Basic Constructor
     *
     * @param Logger|Null Logging instance or Null to do no logging at all
     */
    public function __construct($logger = null)
    {
        if ($logger !== null) {
            $this->logger = $logger;
        } else {
            $this->logger = new Logger('dummy');
            $this->logger->pushHandler(new NullHandler());
        }
    }
   private function test($var1,$var2) {
        $this->logger->debug('test method called with '.$var1.' and '.$var2);
    }

Это лучший способ настроить отладку для моих классов или есть что-то более универсальное / просто более совершенная практика кодирования?

В прошлом я также использовал метод внутри своих классов, который проверяет, $ this -> debug не является нулевым, и если это так, то вызывает Logger с данными, а не отправляет все в нулевой Logger, но для этого требуется несколько методов для каждого уровня журнала:

 /**
     * If debug enabled, send all passed parameters to debugger
     */
    public function debug()
    {
        if (is_null($this->debug)) {
            return;
        }
        $args = func_get_args();
        $this->debug->debug(print_r($args, true));
    }

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

1 Ответ

0 голосов
/ 11 февраля 2020

Используйте вспомогательный класс в глобальном пространстве имен, который имеет несколько функций stati c для доступа.

Быстрый быстрый и грязный

class Debug {
   static $logger = new Logger();
   public static function debug($input) {
      self::$logger->debug($input);
   }
   ... for other functions/wrapping you wish to do
}

Добавление нескольких вспомогательных функций

function debug($input)) {
   Debug::debug($input);
}

и тогда вы хорошо справляетесь с go.

Затем вы можете сделать debug('mystuff') или Debug::debug('mystuff');

Немного сложнее

Используя класс-оболочку stati c, который взаимодействует через __ callStati c, вы можете передавать все запросы экземпляров, которые вы будете делать на регистраторе, как вызов stati c в класс отладки, без необходимости беспокоиться о "копировании" всех методов регистратора в вашу собственную оболочку отладки. Когда вы добавляете даже несколько вспомогательных функций, вам не нужно вводить слишком много для ваших помощников по отладке.

Еще одним преимуществом является то, что вы можете переключать типы регистратора, как вы sh. Ты больше не чувствуешь себя монологом? поменяйте его на что-то другое.

Полный рабочий элементарный пример: https://ideone.com/tAKBWr

<?php
class Logger {
    public function debug($input) {
        var_dump($input);
    }
    public function log($input) {
        echo $input;
    }
}

class Debug {
    protected $logger;
    protected static $_instance = NULL;

    final private function  __construct() { 
        $this->logger = new Logger();
    }

    final private function  __clone() { }

    final public static function getInstance()
    {
        if(null !== static::$_instance){
            return static::$_instance;
        }
        static::$_instance = new static();

        return static::$_instance;
    }

    public function getLogger() 
    {
        return $this->logger;
    }

   static public function __callStatic($name, $args) 
   {
      $logger = self::getInstance()->getLogger();
      if(method_exists($logger, $name)) {

        return $logger->{$name}(...$args);
      } 
   }
}

function debug($input) 
{
    Debug::debug($input);
}

function traceLog($input) 
{
    Debug::log($input);
}


debug(['42','asdfasdf',33]);

traceLog("Moving to track 3");
...