обзор возможностей интерактивной консоли в стиле REPL для PHP
Более полную, оформленную мной статью можно найти в блоге Хекслета, здесь:
https://ru.hexlet.io/blog/posts/php-psysh-ili-chto-takoe-repl-exploratory-development
REPL
[tab]
— Автокомплит- Поддерживает нэймспэйсы
doc
— Документация по стандартным командам PHPList (ls)
— показывает, методы, классы и т.д. (reflection)Wtf
— показывает предыдущие исключенияHistory
— Показывает историю введенных ранее командLs
— список свойств и методов объекта (или глобальных переменных)Dump
— выводит класс или примитив(значения)Show
— выводит код класса или методаWhereami
— выводит код, на исполнении которого мы сейчас остановилисьThrow-up
— выбрасывает исключение или ошибкуTimeit
— профилирование времени — можно выполнить код, переданный в качестве параметра и получить время его выполнения. Можно выполнить данный код указанное количество раз$_
— содержит список команд$__class
— Last class name$__method
— Last method name$__function
— Last function name$__namespace
— Last namespace name- Можно выполнять команды ОС, заключив команду в обратные одинарные кавычки:
pwd
- Можно создавать свои собственные команды (см. настройки)
- Можно прописывать настройки на языке php (т.е. делать вобщем-то что угодно, что будет выполняться перед загрузкой консоли), список команд настройки: https://github.com/bobthecow/psysh/wiki/Config-options
- Можно выполнять команды ОС, заключив команду в обратные одинарные кавычки:
Интегрирована во многие фрэймворки и CMS:
https://github.com/bobthecow/psysh/wiki/Integrations
Breakpoints
eval(\Psy\sh()); -
Делаем точку останова в коде, смотрим результат в командной строке, и что важно, выполняем с этого места команды, столько, сколько нужно\Psy\Shell::debug(get_defined_vars()); -
выводит заданные переменные с их значениями
Зачем (Use Cases)
- Чтобы узнать, как работают команды PHP
- Чтобы быстро попробовать, как что-то сработает в приложении
- Альтернативный отладчик — поставить точку останова и после этого не только посмотреть значения переменных, но еще и выполнить столько операций, сколько надо — попробовать разные варианты без необходимости каждый раз менять код и перезагружать страницу
- Профилирование заданного куска кода — можно очень просто посмотреть, сколько времени выполняется какой-то запрос к БД, или какая-то вычислительная операция
- Короткие команды фрэймворка. В Laravel — вместо «php artisan down» — набираем: «down»
- Я бы назвал это косвенным эффектом, это подключая компоненты фрэймворка, появляется возможность понять глубже, как работает фрэймворк, последовательности подгрузки и выполнения операций
Удобства
- При возникновении ошибки или исключения, результат отображается в консоли в виде текста исключения и консоль продолжает работать. Она не закрывается и можно быстро продолжать работу не теряя результатов
- После закрытия (или падения) консоли и переоткрытия, набор выполненных ранее команд можно быстро повторить из истории
- Автокомплит. Это не совсем тоже самое, что предоставляет IDE, т.к. здесь автокомплит дает возможность получить свойства подгруженного класса и сразу же выполнить метод и получить результат его выполнения. Так мы можем подключать какие-то не совсем известные нам компоненты системы, получать их методы и выполнять их, быстро изучая таким образом их поведения, результаты их работы
- Можно выполнить команду history и сохранить выполненные ранее команды в файл
Интеграция с фреймворком на примере Laravel
В Laravel реализовано под названием tinker
Запускается
php artisan tinker
Дополнительные команды tinker
- Clear-compiled
- Down — перевести сайт в режим обслуживания
- Env — показывает название текущей среды окружения приложения (какой файл .env используется)
- Migrate — выполнить миграции
- Optimize — Cache the framework bootstrap files
- Up — вывести сайт из режима обслуживания
- Inspire — вывести воодушевляющую фразу на экран (пасхалка)
Возможности
- Заполнить БД данными factory(‘App\User’)->create()
- Получить первого пользователя из таблицы пользователей из БД: App\User::first()
- Получить общие настройки приложения из класса app()
- Получить текущие дату-время из Carbon с помощью now()
- Выполнить ассершн local(‘localhost’)->assertResponseOk()
- Получить страницу сайта http(‘google.com’)
- Получить содержимое страницы с помощью $_->getBody().»
- Tinker register(app_path(‘Services’)) — зарегистрировали путь, теперь там будут искаться классы, это позволяет обращаться к классам, лежащим по этому пути только по имени
- User::where(‘id’>10) — отобразит текст сгенерированного SQL-запроса к БД
Выводы
- Возможности отладки
- Отладка в браузере пока не реализована, поддерживается только встроенный в php браузер
- Пошаговая отладка как в XDebug не реализована
- Имеется возможность после останова выполнять операции интерактивно и наблюдать за результатами, столько раз, сколько нужно. По сути это лучше, чем XDebug тем, что можно с заданной точки не просто пошагово выполнить операции, а выполнить их по-разному без множественного перезапуска дебагера и выбрать наиболее подходящий результат выполнения
- Использовать голый PHP довольно бесполезно, намного более эффективно использовать с подгрузкой кода всего приложения
- Реализована поддержка для многих фреймворков, в частности для Laravel
- Недостатки
- Нет возможности сохранить лучший сценарий выполнения и после переоткрытия командной строки перевыполнить его. Хотя есть возможность перевыполнить нужные команды из истории, как и в обычной консоли
- Не выполнить анонимную функцию
- Нельзя вывести графическую информацию — GUI, графики, схемы
- Аналоги
- Boris
- В Python подобный инструмент доступен по-умолчанию, командой python 🙂
Используемые материалы
https://github.com/bobthecow/psysh
https://www.sitepoint.com/interactive-php-debugging-psysh/
https://presentate.com/bobthecow/talks/php-for-pirates
https://laravel-news.com/laravel-tinker
видео:
https://softonsofa.com/tinker-like-a-boss-custom-includes/