Простой отладчик для PHP (Yii)

Снимок экрана 2015-06-08 в 18.19.08

Предисловие

Во время разработки приложения на php периодически возникает необходимость узнать значение переменной в каком-либо участке выполнения кода интерпретатором. Обычно для этого можно использовать банальное

echo $var;

а если переменная представляет из себя структуру, то использовать такие функции:

print_r($var); // OR
var_dump($var);

Чтобы в браузере был приятный и читаемый вид выводимых данных, немного оформим:

echo "<pre>";
print_r($var);
echo "</pre>";

именно последный пример кода у меня сохранен в редакторе Sublime text под снипетом (достаточно набрать PrintR и нажать клавишу таб, чтобы получить весь код из примера выше). Но тем не менее, иногда такого бывает недостаточно для написания серьезной программы.

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

echo "<pre>";
print_r(Yii::app()->user->rules);
echo "</pre>";

Затем, нам нужно на странице вывести список доступных стран или филиалов, которые учавствуют в статистике. Пишем в контроллере статистики следующее:

echo "<pre>";
print_r(User::getListFilials());
echo "</pre>";

и так далее. В итоге, у нас так может со временем скопиться 5-10 таких вызовов подсказок о значениях наших переменных, но удалять их нельзя, так как на этапе активной разработки вся эта информация бывает крайне полезна. И если у вас разработка ведется в двух версиях: development и production, то при заливке обновлений в production необходимо позаботиться о том, чтобы вся отладочная информация была скрыта. Для этого ищем все наши print_r и var_dump, и комментируем их как минимум.

Хотелось бы упростить жизнь в этом плане. И на этой ноте я решил собрать свое не большое решение для отладки кода.

Преимущества

Преимущества компонента в том, что он очень прост в подключении к проекту, пусть то будет писаться на Yii, или на любом другом фреймворке, включая и самописные системы. Он не требует от разработчика писать каждый раз несколько строк кода для оформленной отладочной информации. Мы можем в разных местах добавлять на обзор несколько переменных под отладку, а в конце выполнения программы вывести всю информацию разом на экран. И в любой момент мы можем одним переключателем временно или на совсем отключить вывод окна отладки.
Еще одна фишка данного компонента в том, что при большом количестве выводимых переменных можно запутаться в значениях, что чему принадлежит. Так вот, этот компонент сам достает из кода название переменной, которое мы ей присвоили и показывает его в окне отладки.

Как он работает?

Здесь все просто. У компонента есть метод Debug::add() для добавления переменно под контроль и метод Debug::out() для вывода информации на экран:

Debug::add($var1);
...
Debug::add($var2);
...
Debug::out($local = true);

Переменная $local — это как раз и есть тот самый рубильник, который в положении true выводит окно отладки на экран, а в положении false блокирует вывод. На локальной машине пусть будет вывод отладки, а на удаленной машине отладку выводить не к чему.. :)

Установка

Пример установки я приведу под фреймворк Yii
Скачать компонент можно на гитхабе
https://github.com/marksv/yii_easy_debug

Затем, распакуем файл Debug.php в папку components и убедимся, что конфиг нашего проекта автоматически сканирует папку:

'import'=>array(
	'application.components.*',

Нам осталось сделать вывод окна отладчика, и сделаем это в главном контроллере, от которого у нас наследуются остальные контроллеры. Переопределим родительский метод render() и допишем или в начале, или в конце вывода страницы (кому как удобнее), метод Debug::out(). Пример кода контроллера:

<?php
class Controller extends CController
{
	public function render($view, $data=NULL, $return=false)
	{
		global $local;
		Debug::out($local);
		parent::render($view, $data, $return);
	}
}

В данном случае, у меня переменная $local является глобальной и в файле конфигурации я ей присваиваю true, если программа работает на локалке. Вот как сделано это у меня:

if(isset($_SERVER['HTTP_HOST']) && ($_SERVER['HTTP_HOST'] == 'localhost' || strpos($_SERVER['HTTP_HOST'], 'yourdomain') !== false || strpos($_SERVER['REQUEST_URI'], 'yourdomain') !== false))
{
    $local = true;
    $activeDB = $bases['local'];
}

Я бы не сказал, что это изящный метод для разделения под development и production, можно построить это и на include разных файлах, используя тот же .gitignore, но так я сделал изначально и оно тоже вполне хорошо работает. Кому интересен способ разделения окружения проекта методом include & gitigore, пишите в комментариях, опишу это отдельным постом.

После подключения метода Debug::out(), мы можем пользоваться этим инструментом в любом месте нашего кода с помощью метода Debug::add():

Debug::add($var);

В перспективе есть некоторые идеи, как можно улучшить компонент, и при свободном времени я обязательно его буду допиливать и обтачивать. Буду рад услышать идеи и замечания от всех, кто прочитал эту статью до конца. Пишите свои комментарии!

Ссылка на компонент https://github.com/marksv/yii_easy_debug