Отладчик PHP должен объект обзора


Я очень визуальный человек, и я хотел бы увидеть интересную информацию о объекты, массивы и различные переменные в PHP. В начале я хотел просто эхо '

', вложенностями($ВАР), '
'; обильно на протяжении всей моей код. Потом я познакомился с MVC и начал схватывать концепции ООП и передняя шаблон контроллера. Теперь, после того, как построил свой собственный маленький личный рамки для академического причин и понимания необходимости повторно используемого кода маленькая часть моей души разъедена каждый раз мне приходится вручную вводить этим.

Это была моя попытка в ООП-стиле отладчик, который будет выплевывать различную информацию о переменной. В отладка() метод является единственным общественным способ и он принимает два параметра, 1 является переменной, вы хотите узнать больше о и другими необязательное булево, по умолчанию правда, для переключения вторя сообщение поджигатель/в WebKit инспектор консоли или прямо на экране браузера.

Мой вопрос: это выглядит ужасно? Есть ли способы, что мой код может быть улучшен? Моя логика нелогична?

/**
 * Returns useful information about variables or objects for debugging purposes
 *
 * @package sprayfire
 * @subpackage core
 */
class SprayFireDebugger {

    /**
     * The original variable that needs to be debugged
     *
     * @var mixed
     */
    private $_debugVar;

    /**
     * True if the debug message should be sent to console.log and false if it
     * doesn't
     *
     * @var bool
     */
    private $_doConsoleLog;

    /**
     * The final message that should be echod
     *
     * @var mixed
     */
    private $_debugMessage;

    /**
     * SprayFireDebugger should never rely on __construct dependencies
     *
     * @return void
     */
    public function __construct() {

    }

    /**
     * Will emit useful information about the given variable.  If the second
     * parameter is set to false the message gets displayed on the screen
     * as compared to the debug console
     *
     * @param mixed $var
     * @param bool $toJsConsole
     * @return void
     */
    public function debug($var, $toJsConsole = true) {

        try {

            $this->_debugVar      = $var;
            $this->_doConsoleLog  = $toJsConsole;

            if (is_object($this->_debugVar)) {
                $this->_debugObject();
            } else {
                $this->_debugMessage = $this->_debugVar;
            }

            $this->_send();
            $this->_cleanUpDebug();

            return true;

        } catch (Exception $Exception) {

            // here to catch exceptions from _debugObject()
            error_log($Exception->__toString());
            $this->_cleanUpDebug();
            return false;

        }

    }

    /**
     * Will determine if an object is an exception or not and return
     * appropriate information for an object
     *
     * @return void
     */
    private function _debugObject() {

        $exc = 'Exception';
        $Reflection = new ReflectionClass($this->_debugVar);

        if ($Reflection->getName() === $exc) {
            return $this->_debugException();
        }

        if ($Reflection->getParentClass()) {
            if ($Reflection->getParentClass()->getName() === $exc) {
                return $this->_debugException();
            }
        }

        $debugInfo = $Reflection->export($this->_debugVar, true);

        $this->_debugMessage = $debugInfo;

        return;

    }

    /**
     * Takes an Exception object and turns it into an appropriate array to
     * be sent to the console or screen
     *
     * @return void
     */
    private function _debugException() {

        $debugInfo = array(
            'message' => $this->_debugVar->getMessage(),
            'code' => $this->_debugVar->getCode(),
            'file' => $this->_debugVar->getFile(),
            'line' => $this->_debugVar->getLine(),
            'trace' => $this->_debugVar->getTrace()
        );

        $this->_debugMessage = $debugInfo;

        return;

    }

    /**
     * Sends $this->_debugMessage to the screen or a JS console
     *
     * @return void
     */
    private function _send() {

        if ($this->_doConsoleLog) {
            $this->_sendToConsole();
        } else {
            $this->_sendToScreen();
        }

        if (empty($this->_debugMessage)) {
            throw new Exception('There was no error message to show.  This likely means something is royally messed up!', E_USER_ERROR);
        }

        echo $this->_debugMessage;

        return true;

    }

    /**
     * Echos out a script that logs a JSON ecoded $this->_debugMessage in the
     * browser console window.  If you are testing with IE please ensure you
     * pass false to $this->debug()
     *
     * @return void
     */
    private function _sendToConsole() {

        $consoleMsgMarkup = '<p style="position: absolute; bottom: 0; right: 1em;" class="sprayfire-debug-message">Debug info sent to console!</p>';

        $scriptMarkup = '<script type="text/javascript">';
        $scriptMarkup .= 'console.log(' . json_encode($this->_debugMessage) . ')';
        $scriptMarkup .= '</script>';

        $this->_debugMessage = $consoleMsgMarkup . $scriptMarkup;

        return;

    }

    /**
     * Echo the message to the main browser window
     *
     * @return void
     */
    private function _sendToScreen() {

        ob_start();
        var_dump($this->_debugMessage);
        $varDump = ob_get_clean();

        if (!$varDump) {
            throw new Exception('The output buffer was not initiated for dumping to the screen!', E_USER_ERROR);
        }

        $screenMarkup = '<pre>' . $varDump . '</pre>';

        $this->_debugMessage = $screenMarkup;

        return;

    }

    /**
     * Reset the class properties to be ready for the next debug call
     *
     * @return void
     */
    private function _cleanUpDebug() {

        $this->_debugVar      = NULL;
        $this->_doConsoleLog  = NULL;
        $this->_debugMessage  = NULL;

        return;

    }

}

// End SprayFireDebugger

Код, кажется, работает правильно, но я также соло-разработчика без каких-либо экспертную оценку. Я думаю, что я не знаю, что я не знаю. Спасибо за взгляд, я ценю любую обратную связь.



Комментарии
2 ответа


Это выглядит ужасно?

Это на самом деле выглядит здорово:


  • Прекрасно согласуется

  • Код является самостоятельной документально, простой и разбивается на соответствующие блоки (функций имеет смысла)

  • phpDoc везде!

Я бы пойти так далеко, как говорят, что это второй самый хорошо написанный кусок PHP-кода, которые я видел на моем достаточно ограниченном времени на проверку кода. И это на самом деле полезно. Я использую аналогичного класса на 2*10 проект^6 Количество строк и это очень полезно. Вы должны изучить интеграция отладчика xdebug в вашем классе, за некоторые бонусные очки.


Есть ли способы, что мой код может быть улучшен?

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

Очень небольшое предложение: я абсолютно ненавижу префикса частная / защищенные методы и члены с символа подчеркивания. Это:

private $_debugVar;

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


  • Все приличные IDE имеет покорителей код / схемы различные схемы окраски для различных областей видимости. Большинство этих мнений слишком сортируемых на видимость.

  • Все приличные язи будут только предоставлять открытые методы / члены через автозавершения кода при использовании классов.


Моя логика нелогична?

Неа.

5
ответ дан 12 ноября 2011 в 04:11 Источник Поделиться

У вас есть отличная идея с регистрацией консоли. Я должен установить, что к моему отладки вещи в какой-то момент. Несколько предложений, как многословие и подход:

В настоящее время, вам придется сделать это:

$debugger = new SprayFireDebugger(); // Instantiate the object
$debugger->debug($test_var_3); // Method call on the object with a variable
$debugger->debug($test_var_8); // Duplicate that work for another variable.

Каждый раз, когда вы хотите отладить. Вы будете представлять переменную в глобальной области видимости, или вы собираетесь иметь не менее двух линий на отладку + 1 для каждой новой переменной, которую требуется отладить. Другая проблема заключается в том, что без каких-либо "конфигурации окружающей среды", вы собираетесь столкнуться с этой проблемой: если оставить переменную отладки в коде, он будет отлаживать на живых серверах. В результате всего этого, у вас очень подробный процесс, который вы собираетесь быть добавление и удаление все время и закомментировав или удалив всякий раз, когда вы сделать код видео.

Вот простая функция, которую я использую:

function debug($args) {
if (DEBUG) { // Don't make anything public on live servers.
$vals = func_get_args(); // Every new argument will be a new debug.
foreach($vals as $val){ // Loop over each argument
// Do whatever you want to output the debugging.
echo "<pre class='debug' style='font-size:12pt;background-color:white;color:black;position:relative;z-index:10'>";
var_dump($val);
echo "</pre>";
}
}
}

А раз так, вот мои предложения:


  • Использовать функцию-оболочку, чтобы уменьшить многословие (я использую отладки()).

  • Учетная запись для нескольких переменных в качестве аргументов, например (отладки($то, $somethingelse, $другой)).

  • Предотвратить отладки на живых серверах (например, с помощью отладки постоянный параметр).

В вашем случае, у вас есть отличная идея с ненавязчивыми ведения журнала консоли. Таким образом, ваша подпись функции должны быть изменены от моего предложения добавить:


  1. две сплит функцию обертки, например, отладка (параметр$ARG, $arg5 не равны, $arg8, $arg7) и console_debug (параметр$ARG, $arg5 не равны, $arg8)

  2. или дополнительный, всегда есть аргумент отладка(правда, параметр $ARG, $arg5 не равны,
    $arg8)

  3. или всегда использовать массив отладки(массива (параметр$ARG, $arg5 не равны, $arg8), правда)

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

0
ответ дан 13 ноября 2011 в 04:11 Источник Поделиться