HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Традиционные инструменты, используемые до REPL в PHP - это var_dump()+die() и XDebug. REPL (Read, Execute, Print Loop) - новый инструмент, позволяющий сделать этот цикл более удобным, интерактивным и быстрым. Во многих языках и теперь и в PHP он реализован как командная строка, которая получает код, по необходимости принимает ввод от пользователя, выполняет код и сразу же выводит результат выполнения.</p>
1 <p>Традиционные инструменты, используемые до REPL в PHP - это var_dump()+die() и XDebug. REPL (Read, Execute, Print Loop) - новый инструмент, позволяющий сделать этот цикл более удобным, интерактивным и быстрым. Во многих языках и теперь и в PHP он реализован как командная строка, которая получает код, по необходимости принимает ввод от пользователя, выполняет код и сразу же выводит результат выполнения.</p>
2 <p>Давайте посмотрим, что он нам может предложить.</p>
2 <p>Давайте посмотрим, что он нам может предложить.</p>
3 <h2>Содержание</h2>
3 <h2>Содержание</h2>
4 <ul><li><a>Что такое REPL, Exploratory development</a></li>
4 <ul><li><a>Что такое REPL, Exploratory development</a></li>
5 <li><a>Запуск PsySH</a></li>
5 <li><a>Запуск PsySH</a></li>
6 <li><a>Первый метод - REPL</a></li>
6 <li><a>Первый метод - REPL</a></li>
7 <li><a>Второй метод - Debug</a></li>
7 <li><a>Второй метод - Debug</a></li>
8 <li><a>Зачем (Use Cases)</a></li>
8 <li><a>Зачем (Use Cases)</a></li>
9 <li><a>Удобства</a></li>
9 <li><a>Удобства</a></li>
10 <li><a>Интеграция с фреймворком на примере Laravel</a></li>
10 <li><a>Интеграция с фреймворком на примере Laravel</a></li>
11 <li><a>Выводы</a></li>
11 <li><a>Выводы</a></li>
12 <li><a>P.S.:</a></li>
12 <li><a>P.S.:</a></li>
13 <li><a>Используемые материалы</a></li>
13 <li><a>Используемые материалы</a></li>
14 </ul><h2>Что такое REPL, Exploratory development</h2>
14 </ul><h2>Что такое REPL, Exploratory development</h2>
15 <p>Когда-то я отчаялся изучить всю документацию по всем необходимым технологиям и запомнить и понять всё, что там написано, и начал писать то, что помню, думая, что хоть как-нибудь справлюсь. Это помогло, оказалось, что с помощью такого подхода можно двигаться вперед в условиях повышенной безалаберности неизвестности</p>
15 <p>Когда-то я отчаялся изучить всю документацию по всем необходимым технологиям и запомнить и понять всё, что там написано, и начал писать то, что помню, думая, что хоть как-нибудь справлюсь. Это помогло, оказалось, что с помощью такого подхода можно двигаться вперед в условиях повышенной безалаберности неизвестности</p>
16 <p>Недавно я узнал, что это не просто отчаянная попытка двоечника, а системный подход под названием<a>Exploratory development</a>, что переводится как исследовательская разработка</p>
16 <p>Недавно я узнал, что это не просто отчаянная попытка двоечника, а системный подход под названием<a>Exploratory development</a>, что переводится как исследовательская разработка</p>
17 <p>Я люблю исследования, поэтому этот термин и подход мне очень нравится</p>
17 <p>Я люблю исследования, поэтому этот термин и подход мне очень нравится</p>
18 <p>Такое программирование выглядит как бесконечный цикл примерно следующего вида:</p>
18 <p>Такое программирование выглядит как бесконечный цикл примерно следующего вида:</p>
19 <ul><li>Узнать примерно, как написать то, что нужно</li>
19 <ul><li>Узнать примерно, как написать то, что нужно</li>
20 <li>Написать</li>
20 <li>Написать</li>
21 <li>Проверить, что получилось, как работает</li>
21 <li>Проверить, что получилось, как работает</li>
22 <li>Осознать ограничения, исправить ошибки</li>
22 <li>Осознать ограничения, исправить ошибки</li>
23 <li>Повторить, выйти за рамки :)</li>
23 <li>Повторить, выйти за рамки :)</li>
24 </ul><p>Или на другом этапе этот цикл может быть представлен так:</p>
24 </ul><p>Или на другом этапе этот цикл может быть представлен так:</p>
25 <ul><li>Найти часть кода, который работает не так, как хочется</li>
25 <ul><li>Найти часть кода, который работает не так, как хочется</li>
26 <li>Понять, почему</li>
26 <li>Понять, почему</li>
27 <li>Изменить (исправить)</li>
27 <li>Изменить (исправить)</li>
28 <li>Повторить</li>
28 <li>Повторить</li>
29 </ul><p>Чем быстрее выполняются такие циклы, тем быстрее разработка и исследование используемых технологий.</p>
29 </ul><p>Чем быстрее выполняются такие циклы, тем быстрее разработка и исследование используемых технологий.</p>
30 <p>Традиционные инструменты, используемые до REPL в PHP - это var_dump()+die() и XDebug.</p>
30 <p>Традиционные инструменты, используемые до REPL в PHP - это var_dump()+die() и XDebug.</p>
31 <p>REPL (Read, Execute, Print Loop) - новый инструмент, позволяющий сделать этот цикл более удобным, интерактивным и быстрым.</p>
31 <p>REPL (Read, Execute, Print Loop) - новый инструмент, позволяющий сделать этот цикл более удобным, интерактивным и быстрым.</p>
32 <p>Во многих языках и теперь и в PHP он реализован как командная строка, которая получает код, по необходимости принимает ввод от пользователя, выполняет код и сразу же выводит результат выполнения. Давайте посмотрим, что он нам может предложить.</p>
32 <p>Во многих языках и теперь и в PHP он реализован как командная строка, которая получает код, по необходимости принимает ввод от пользователя, выполняет код и сразу же выводит результат выполнения. Давайте посмотрим, что он нам может предложить.</p>
33 <h2>Запуск PsySH</h2>
33 <h2>Запуск PsySH</h2>
34 <p>Процесс установки в зависимости от ОС можно найти здесь:<a>https://psysh.org/#install</a></p>
34 <p>Процесс установки в зависимости от ОС можно найти здесь:<a>https://psysh.org/#install</a></p>
35 <p>и здесь:<a>https://github.com/bobthecow/psysh/wiki/Installation</a></p>
35 <p>и здесь:<a>https://github.com/bobthecow/psysh/wiki/Installation</a></p>
36 <p>Запуск выполняется командой:</p>
36 <p>Запуск выполняется командой:</p>
37 <p>psysh</p>
37 <p>psysh</p>
38 <p>Работу с консолью можно разбить на два больших класса. Первый - использование её с нуля, полностью интерактивное программирование - подключение нужных библиотек и выполнение операций с ними. Назову его REPL. Второй - сделать в имеющемся коде приложения точку останова, запустить приложение, дойти до точки останова и из неё получить доступ к консоли и начать интерактивное программирование. Назову его Debug</p>
38 <p>Работу с консолью можно разбить на два больших класса. Первый - использование её с нуля, полностью интерактивное программирование - подключение нужных библиотек и выполнение операций с ними. Назову его REPL. Второй - сделать в имеющемся коде приложения точку останова, запустить приложение, дойти до точки останова и из неё получить доступ к консоли и начать интерактивное программирование. Назову его Debug</p>
39 <h2>Первый метод - REPL</h2>
39 <h2>Первый метод - REPL</h2>
40 <p>Самое простое, что мы можем делать - выполнять вычисления и выражения и сразу же получать их результат. Посчитать как на калькуляторе, либо выполнить какую-то операцию над строками или массивами и посмотреть, что получается</p>
40 <p>Самое простое, что мы можем делать - выполнять вычисления и выражения и сразу же получать их результат. Посчитать как на калькуляторе, либо выполнить какую-то операцию над строками или массивами и посмотреть, что получается</p>
41 <p>Дальше приведу основной список команд консоли psysh:</p>
41 <p>Дальше приведу основной список команд консоли psysh:</p>
42 <ul><li>doc - Отображает документацию по стандартным командам PHP и классам. Можем почитать то, что не успели прямо здесь</li>
42 <ul><li>doc - Отображает документацию по стандартным командам PHP и классам. Можем почитать то, что не успели прямо здесь</li>
43 <li>list (ls) - показывает методы и свойства классов (или глобальных переменных и т.п.) (reflection), сродни автокомплиту</li>
43 <li>list (ls) - показывает методы и свойства классов (или глобальных переменных и т.п.) (reflection), сродни автокомплиту</li>
44 <li>wtf - показывает предыдущее (самое свежее) исключение - можно вспомнить, какая ошибка была ранее</li>
44 <li>wtf - показывает предыдущее (самое свежее) исключение - можно вспомнить, какая ошибка была ранее</li>
45 <li>history - Показывает историю введенных ранее команд, есть параметры фильтрации</li>
45 <li>history - Показывает историю введенных ранее команд, есть параметры фильтрации</li>
46 <li>dump - выводит класс или примитив (значения)</li>
46 <li>dump - выводит класс или примитив (значения)</li>
47 <li>show - выводит код класса или метода</li>
47 <li>show - выводит код класса или метода</li>
48 <li>whereami - выводит код, на исполнении которого мы сейчас остановились</li>
48 <li>whereami - выводит код, на исполнении которого мы сейчас остановились</li>
49 <li>throw-up - выбрасывает исключение или ошибку</li>
49 <li>throw-up - выбрасывает исключение или ошибку</li>
50 <li>timeit - профилирование времени - можно выполнить код, переданный в качестве параметра и получить время его выполнения. Можно выполнить данный код указанное количество раз</li>
50 <li>timeit - профилирование времени - можно выполнить код, переданный в качестве параметра и получить время его выполнения. Можно выполнить данный код указанное количество раз</li>
51 <li>$_ - содержит последний полученный результат, с помощью неё можем сделать что-то с полученным на предыдущем шаге примитивом (числом - посчитать, строкой - объединить) или объектом - вызывать метод</li>
51 <li>$_ - содержит последний полученный результат, с помощью неё можем сделать что-то с полученным на предыдущем шаге примитивом (числом - посчитать, строкой - объединить) или объектом - вызывать метод</li>
52 <li>[tab] - Автокомплит, показывает возможные варианты имён классов, методов и т.п.</li>
52 <li>[tab] - Автокомплит, показывает возможные варианты имён классов, методов и т.п.</li>
53 <li>Поддерживает неймспейсы (можно подключать функционал из библиотек)</li>
53 <li>Поддерживает неймспейсы (можно подключать функционал из библиотек)</li>
54 <li>Можно выполнять команды ОС, заключив команду в обратные кавычки: pwd</li>
54 <li>Можно выполнять команды ОС, заключив команду в обратные кавычки: pwd</li>
55 <li>Можно прописывать настройки на языке php (т.е. делать вобщем-то что угодно, что будет выполняться каждый раз перед загрузкой консоли), список команд настройки:<a>https://github.com/bobthecow/psysh/wiki/Config-options</a></li>
55 <li>Можно прописывать настройки на языке php (т.е. делать вобщем-то что угодно, что будет выполняться каждый раз перед загрузкой консоли), список команд настройки:<a>https://github.com/bobthecow/psysh/wiki/Config-options</a></li>
56 <li>Можно создавать свои собственные команды в настройках</li>
56 <li>Можно создавать свои собственные команды в настройках</li>
57 </ul><h2>Второй метод - Debug</h2>
57 </ul><h2>Второй метод - Debug</h2>
58 <p>Делая в коде точки останова (breakpoints), мы</p>
58 <p>Делая в коде точки останова (breakpoints), мы</p>
59 <ul><li>eval(\Psy\sh()); - Делаем точку останова в коде, смотрим результат в командной строке, и что важно, выполняем с этого места команды, столько, сколько нужно</li>
59 <ul><li>eval(\Psy\sh()); - Делаем точку останова в коде, смотрим результат в командной строке, и что важно, выполняем с этого места команды, столько, сколько нужно</li>
60 <li>\Psy\Shell::debug(get_defined_vars()); - выводит заданные переменные с их значениями</li>
60 <li>\Psy\Shell::debug(get_defined_vars()); - выводит заданные переменные с их значениями</li>
61 </ul><h2>Зачем (Use Cases)</h2>
61 </ul><h2>Зачем (Use Cases)</h2>
62 <p>Теперь, когда мы представляем в целом, зачем, и что и как мы можем делать с помощью консоли, я думаю будет хорошо представить несколько чуть более конкретных примеров того, для чего именно это может понадобиться в процессе разработки:</p>
62 <p>Теперь, когда мы представляем в целом, зачем, и что и как мы можем делать с помощью консоли, я думаю будет хорошо представить несколько чуть более конкретных примеров того, для чего именно это может понадобиться в процессе разработки:</p>
63 <ul><li>Чтобы узнать, как работают команды PHP</li>
63 <ul><li>Чтобы узнать, как работают команды PHP</li>
64 <li>Чтобы быстро попробовать, как что-то сработает в приложении. Под что-то я понимаю вызов метода своего класса, или класса какой-то используемой сторонней библиотеки с одними и с другими параметрами</li>
64 <li>Чтобы быстро попробовать, как что-то сработает в приложении. Под что-то я понимаю вызов метода своего класса, или класса какой-то используемой сторонней библиотеки с одними и с другими параметрами</li>
65 <li>Альтернативный отладчик - поставить точку останова и после этого не только посмотреть значения переменных, но еще и выполнить с создавшимся в этой точке состоянием переменных столько операций, сколько надо - попробовать разные варианты без необходимости каждый раз менять код и перезагружать приложение</li>
65 <li>Альтернативный отладчик - поставить точку останова и после этого не только посмотреть значения переменных, но еще и выполнить с создавшимся в этой точке состоянием переменных столько операций, сколько надо - попробовать разные варианты без необходимости каждый раз менять код и перезагружать приложение</li>
66 <li>Профилирование заданного куска кода - можно очень просто посмотреть, сколько времени выполняется какой-то запрос к БД, или какая-то вычислительная операция</li>
66 <li>Профилирование заданного куска кода - можно очень просто посмотреть, сколько времени выполняется какой-то запрос к БД, или какая-то вычислительная операция</li>
67 <li>Короткие команды фрэймворка. В Laravel - вместо "php artisan down" - набираем: "down"</li>
67 <li>Короткие команды фрэймворка. В Laravel - вместо "php artisan down" - набираем: "down"</li>
68 <li>Подключая компоненты фрэймворка, появляется возможность понять глубже, как работает фрэймворк, последовательности подгрузки и выполнения операций</li>
68 <li>Подключая компоненты фрэймворка, появляется возможность понять глубже, как работает фрэймворк, последовательности подгрузки и выполнения операций</li>
69 </ul><h2>Удобства</h2>
69 </ul><h2>Удобства</h2>
70 <p>Теперь рассмотрим некоторые более конкретные удобства, которые можно увидеть в этом инструменте:</p>
70 <p>Теперь рассмотрим некоторые более конкретные удобства, которые можно увидеть в этом инструменте:</p>
71 <ul><li>При возникновении ошибки или исключения, результат отображается в консоли в виде текста исключения и консоль продолжает работать. Она не закрывается и можно быстро продолжать работу не теряя результатов</li>
71 <ul><li>При возникновении ошибки или исключения, результат отображается в консоли в виде текста исключения и консоль продолжает работать. Она не закрывается и можно быстро продолжать работу не теряя результатов</li>
72 <li>После закрытия (или падения) консоли и переоткрытия, набор выполненных ранее команд можно быстро повторить из истории</li>
72 <li>После закрытия (или падения) консоли и переоткрытия, набор выполненных ранее команд можно быстро повторить из истории</li>
73 <li>Автокомплит. Это не совсем тоже самое, что предоставляет IDE, т.к. здесь автокомплит дает возможность получить свойства подгруженного класса и сразу же выполнить метод и получить результат его выполнения. Так мы можем подключать какие-то не совсем известные нам компоненты системы, получать их методы и выполнять их, быстро изучая таким образом их поведения, результаты их работы</li>
73 <li>Автокомплит. Это не совсем тоже самое, что предоставляет IDE, т.к. здесь автокомплит дает возможность получить свойства подгруженного класса и сразу же выполнить метод и получить результат его выполнения. Так мы можем подключать какие-то не совсем известные нам компоненты системы, получать их методы и выполнять их, быстро изучая таким образом их поведения, результаты их работы</li>
74 <li>Можно выполнить команду history и сохранить выполненные ранее команды в файл как результирующий код</li>
74 <li>Можно выполнить команду history и сохранить выполненные ранее команды в файл как результирующий код</li>
75 </ul><h2>Интеграция с фреймворком на примере Laravel</h2>
75 </ul><h2>Интеграция с фреймворком на примере Laravel</h2>
76 <p>Основной эффект от использования такой консоли происходит при полном подключении всего функционала, имеющегося в нашем приложении.</p>
76 <p>Основной эффект от использования такой консоли происходит при полном подключении всего функционала, имеющегося в нашем приложении.</p>
77 <p>Всё это можно подключить самостоятельно, через настройки, или последовательно выполняя команды в консоли, но во многих фреймворках эта возможность уже встроена.</p>
77 <p>Всё это можно подключить самостоятельно, через настройки, или последовательно выполняя команды в консоли, но во многих фреймворках эта возможность уже встроена.</p>
78 <p><a>https://github.com/bobthecow/psysh/wiki/Integrations</a></p>
78 <p><a>https://github.com/bobthecow/psysh/wiki/Integrations</a></p>
79 <p>Рассмотрим её на примере Laravel. В Laravel PsySH реализован под названием Tinker. Он интегрирован в среду и запускается с помощью консольной утилиты Artisan:</p>
79 <p>Рассмотрим её на примере Laravel. В Laravel PsySH реализован под названием Tinker. Он интегрирован в среду и запускается с помощью консольной утилиты Artisan:</p>
80 <p>php artisan tinker</p>
80 <p>php artisan tinker</p>
81 <h3>Дополнительные команды Tinker</h3>
81 <h3>Дополнительные команды Tinker</h3>
82 <p>Tinker добавляет в PsySH свои дополнительные команды, ориентированные именно на Laravel. Перечислим их для примерного понимания</p>
82 <p>Tinker добавляет в PsySH свои дополнительные команды, ориентированные именно на Laravel. Перечислим их для примерного понимания</p>
83 <ul><li>down - перевести сайт в режим обслуживания</li>
83 <ul><li>down - перевести сайт в режим обслуживания</li>
84 <li>up - вывести сайт из режима обслуживания</li>
84 <li>up - вывести сайт из режима обслуживания</li>
85 <li>env - показывает название текущей среды окружения приложения (какой файл .env используется)</li>
85 <li>env - показывает название текущей среды окружения приложения (какой файл .env используется)</li>
86 <li>migrate - выполнить миграции</li>
86 <li>migrate - выполнить миграции</li>
87 <li>inspire - вывести воодушевляющую фразу на экран (пасхалка)</li>
87 <li>inspire - вывести воодушевляющую фразу на экран (пасхалка)</li>
88 <li>Есть и другие команды, такие как clear-compiled и optimize</li>
88 <li>Есть и другие команды, такие как clear-compiled и optimize</li>
89 </ul><h3>Возможности</h3>
89 </ul><h3>Возможности</h3>
90 <p>После подключения всего кода приложения мы можем из консоли вызывать любые имеющиеся в приложении библиотеки, делать практически всё тоже самое, что мы можем делать из кода приложения.</p>
90 <p>После подключения всего кода приложения мы можем из консоли вызывать любые имеющиеся в приложении библиотеки, делать практически всё тоже самое, что мы можем делать из кода приложения.</p>
91 <p>Приведу несколько примеров того, что можно делать в консоли, подключив контекст фреймворка:</p>
91 <p>Приведу несколько примеров того, что можно делать в консоли, подключив контекст фреймворка:</p>
92 <ul><li>Заполнить БД данными: factory('App\User')-&gt;create()</li>
92 <ul><li>Заполнить БД данными: factory('App\User')-&gt;create()</li>
93 <li>Получить первого пользователя из таблицы пользователей из БД: App\User::first()</li>
93 <li>Получить первого пользователя из таблицы пользователей из БД: App\User::first()</li>
94 <li>Получить общие настройки приложения: app()</li>
94 <li>Получить общие настройки приложения: app()</li>
95 <li>Получить текущие дату-время из библиотеки Carbon: now()</li>
95 <li>Получить текущие дату-время из библиотеки Carbon: now()</li>
96 <li>Выполнить ассершн: local('localhost')-&gt;assertResponseOk()</li>
96 <li>Выполнить ассершн: local('localhost')-&gt;assertResponseOk()</li>
97 <li>Получить страницу сайта: http('google.com')</li>
97 <li>Получить страницу сайта: http('google.com')</li>
98 <li>Получить содержимое загруженной предыдущей командой страницы: $_-&gt;getBody().''</li>
98 <li>Получить содержимое загруженной предыдущей командой страницы: $_-&gt;getBody().''</li>
99 <li>register(app_path('Services')) - зарегистрировали путь, теперь там будут искаться классы, это позволяет обращаться к классам, лежащим по этому пути только по имени, без указания пути: SomeService-&gt;getData($someInput);</li>
99 <li>register(app_path('Services')) - зарегистрировали путь, теперь там будут искаться классы, это позволяет обращаться к классам, лежащим по этому пути только по имени, без указания пути: SomeService-&gt;getData($someInput);</li>
100 <li>User::where('id'&gt;10) - отобразит текст сгенерированного SQL-запроса к БД</li>
100 <li>User::where('id'&gt;10) - отобразит текст сгенерированного SQL-запроса к БД</li>
101 <li>$_-&gt;get() - получит и отобразит пользователей из предыдущего запроса</li>
101 <li>$_-&gt;get() - получит и отобразит пользователей из предыдущего запроса</li>
102 </ul><h2>Выводы</h2>
102 </ul><h2>Выводы</h2>
103 <p>Интерактивная REPL консоль PsySH позволяет производить интерактивную отладку и исследовательскую разработку.</p>
103 <p>Интерактивная REPL консоль PsySH позволяет производить интерактивную отладку и исследовательскую разработку.</p>
104 <p>Она может быть полезна и стать ежедневно используемым инструментом как начинающим программистам для интенсивного обучения особенностей работы языка, так и практикующим программистам для интенсивной работы с новыми и сложными библиотеками при развитии больших систем</p>
104 <p>Она может быть полезна и стать ежедневно используемым инструментом как начинающим программистам для интенсивного обучения особенностей работы языка, так и практикующим программистам для интенсивной работы с новыми и сложными библиотеками при развитии больших систем</p>
105 <h3>Возможности отладки</h3>
105 <h3>Возможности отладки</h3>
106 <p>Отладка в браузере пока не реализована, поддерживается только встроенный в php браузер, но и REPL-консоль - это не про линейную, а про интерактивную отладку</p>
106 <p>Отладка в браузере пока не реализована, поддерживается только встроенный в php браузер, но и REPL-консоль - это не про линейную, а про интерактивную отладку</p>
107 <p>В качестве отладки имеется возможность после останова выполнять операции интерактивно и наблюдать за результатами, столько раз, сколько нужно. По сути это лучше, или точнее сказать, другое, чем пошаговое выполнение в XDebug в том, что можно с заданной точки не просто пошагово выполнить заданную последовательность операций, а выполнить их по-разному без множественного перезапуска дебагера и выбрать код с наиболее подходящим результатом выполнения</p>
107 <p>В качестве отладки имеется возможность после останова выполнять операции интерактивно и наблюдать за результатами, столько раз, сколько нужно. По сути это лучше, или точнее сказать, другое, чем пошаговое выполнение в XDebug в том, что можно с заданной точки не просто пошагово выполнить заданную последовательность операций, а выполнить их по-разному без множественного перезапуска дебагера и выбрать код с наиболее подходящим результатом выполнения</p>
108 <h3>Интерактивная разработка</h3>
108 <h3>Интерактивная разработка</h3>
109 <p>Использовать голый PHP довольно бесполезно, намного более эффективно использовать с подгрузкой кода всего приложения. Подгрузка кода приложений интегрирована для многих фреймворков, в частности для Laravel</p>
109 <p>Использовать голый PHP довольно бесполезно, намного более эффективно использовать с подгрузкой кода всего приложения. Подгрузка кода приложений интегрирована для многих фреймворков, в частности для Laravel</p>
110 <h3>Недостатки</h3>
110 <h3>Недостатки</h3>
111 <p>Нет возможности сохранить лучший сценарий выполнения и после переоткрытия командной строки перевыполнить его. Хотя есть возможность перевыполнить нужные команды из истории, как и в обычной консоли.</p>
111 <p>Нет возможности сохранить лучший сценарий выполнения и после переоткрытия командной строки перевыполнить его. Хотя есть возможность перевыполнить нужные команды из истории, как и в обычной консоли.</p>
112 <p>Видимо, для того, чтобы выполнить анонимную функцию, нужно будет скопировать её код в консоль.</p>
112 <p>Видимо, для того, чтобы выполнить анонимную функцию, нужно будет скопировать её код в консоль.</p>
113 <p>Нет возможности вывести в консоль графическую информацию, такую как GUI, графики, схемы</p>
113 <p>Нет возможности вывести в консоль графическую информацию, такую как GUI, графики, схемы</p>
114 <p>Не понятно, как тестировать запросы по API</p>
114 <p>Не понятно, как тестировать запросы по API</p>
115 <h3>Аналоги</h3>
115 <h3>Аналоги</h3>
116 <ul><li>Boris</li>
116 <ul><li>Boris</li>
117 <li>Подобные инструменты появились ранее во многих языках программирования, таких как Ruby и других и активно используются разработчиками. В ruby например есть расширенная версия pry</li>
117 <li>Подобные инструменты появились ранее во многих языках программирования, таких как Ruby и других и активно используются разработчиками. В ruby например есть расширенная версия pry</li>
118 <li>В Python подобный инструмент доступен по-умолчанию, командой python. Что же у них доступно в качестве дополнительных инструментов?</li>
118 <li>В Python подобный инструмент доступен по-умолчанию, командой python. Что же у них доступно в качестве дополнительных инструментов?</li>
119 </ul><h2>P.S.:</h2>
119 </ul><h2>P.S.:</h2>
120 <p>Когда Вы поправите код в своём любимом редакторе и захотите протестировать свой класс в Tinker, то обнаружите, что в нём используется код в состоянии, которое было на момент запуска tinker. Чтобы получить новый код, понадобится перезагрузить Tinker. Для того, чтобы иметь возможность подгружать код без перезагрузки есть отладчик, основанный на tinker, под названием Tinx. В нём есть команда, перезагружающая код, а также несколько magic команд, упрощающих отладку моделей.</p>
120 <p>Когда Вы поправите код в своём любимом редакторе и захотите протестировать свой класс в Tinker, то обнаружите, что в нём используется код в состоянии, которое было на момент запуска tinker. Чтобы получить новый код, понадобится перезагрузить Tinker. Для того, чтобы иметь возможность подгружать код без перезагрузки есть отладчик, основанный на tinker, под названием Tinx. В нём есть команда, перезагружающая код, а также несколько magic команд, упрощающих отладку моделей.</p>
121 <p>Удачи с REPL!</p>
121 <p>Удачи с REPL!</p>
122 <h2>Используемые материалы</h2>
122 <h2>Используемые материалы</h2>
123 <p><a>https://psysh.org/</a></p>
123 <p><a>https://psysh.org/</a></p>
124 <p><a>https://psysh.org/#docs</a></p>
124 <p><a>https://psysh.org/#docs</a></p>
125 <p><a>https://github.com/bobthecow/psysh</a></p>
125 <p><a>https://github.com/bobthecow/psysh</a></p>
126 <p><a>https://www.sitepoint.com/interactive-php-debugging-psysh/</a></p>
126 <p><a>https://www.sitepoint.com/interactive-php-debugging-psysh/</a></p>
127 <p><a>https://presentate.com/bobthecow/talks/php-for-pirates</a></p>
127 <p><a>https://presentate.com/bobthecow/talks/php-for-pirates</a></p>
128 <p><a>https://laravel-news.com/laravel-tinker</a></p>
128 <p><a>https://laravel-news.com/laravel-tinker</a></p>
129 <p>видео:<a>https://softonsofa.com/tinker-like-a-boss-custom-includes/</a></p>
129 <p>видео:<a>https://softonsofa.com/tinker-like-a-boss-custom-includes/</a></p>
130 <p><a>https://www.youtube.com/watch?v=KeQThH9tDB0</a></p>
130 <p><a>https://www.youtube.com/watch?v=KeQThH9tDB0</a></p>
131 <p><a>https://www.youtube.com/watch?v=xgo3klUrpSc</a></p>
131 <p><a>https://www.youtube.com/watch?v=xgo3klUrpSc</a></p>