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')->create()</li>
92
<ul><li>Заполнить БД данными: factory('App\User')->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')->assertResponseOk()</li>
96
<li>Выполнить ассершн: local('localhost')->assertResponseOk()</li>
97
<li>Получить страницу сайта: http('google.com')</li>
97
<li>Получить страницу сайта: http('google.com')</li>
98
<li>Получить содержимое загруженной предыдущей командой страницы: $_->getBody().''</li>
98
<li>Получить содержимое загруженной предыдущей командой страницы: $_->getBody().''</li>
99
<li>register(app_path('Services')) - зарегистрировали путь, теперь там будут искаться классы, это позволяет обращаться к классам, лежащим по этому пути только по имени, без указания пути: SomeService->getData($someInput);</li>
99
<li>register(app_path('Services')) - зарегистрировали путь, теперь там будут искаться классы, это позволяет обращаться к классам, лежащим по этому пути только по имени, без указания пути: SomeService->getData($someInput);</li>
100
<li>User::where('id'>10) - отобразит текст сгенерированного SQL-запроса к БД</li>
100
<li>User::where('id'>10) - отобразит текст сгенерированного SQL-запроса к БД</li>
101
<li>$_->get() - получит и отобразит пользователей из предыдущего запроса</li>
101
<li>$_->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>