Обзор PsySH (Tinker) — интерактивная консоль REPL для PHP

обзор возможностей интерактивной консоли в стиле REPL для PHP

Более полную, оформленную мной статью можно найти в блоге Хекслета, здесь:
https://ru.hexlet.io/blog/posts/php-psysh-ili-chto-takoe-repl-exploratory-development

REPL

  • [tab] — Автокомплит
  • Поддерживает нэймспэйсы
  • doc — Документация по стандартным командам PHP
  • List (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://psysh.org/

https://psysh.org/#docs

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/

https://www.youtube.com/watch?v=KeQThH9tDB0

https://www.youtube.com/watch?v=xgo3klUrpSc

Добавить комментарий

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